PHITS

PHITS
Multi-Purpose Particle and Heavy Ion Transport code System
PHITS 講習会
Voxelファントムの作り方
2014年8月改訂
title
1
Voxelファントムとは?
直方体を積み重ねて生物など
複雑な体系を再現したもの
(マニュアル4.7.5.3)
PHITSのUniverseとLattice
構造を使って構築
(マニュアル4.7.3&4.7.4)
低分解能
高分解能
Introduction
2
Voxelファントムを用いた計算例
粒子線治療時の2次放射線
被ばく線量評価
T. Sato et al.
Radiat. Res. (2009)
BNCTの治療効果推定
H. Kumada et al.
J. Phys.: Conf. Ser. (2007)
Introduction
3
講習の流れ
1. Universe
2. Lattice
3. 簡易Voxelファントム
4. Dicom形式からの変換
5. まとめ
Table of Contents
4
Universeとは?
→ PHITSの中の仮想空間
Universe1
PHITSでは,いくつもの仮想空
間(universe)を定義できる
実際に粒子輸送の舞台とな
るのはメイン空間のみ
メイン空間の一部を別の
universeで満たすことにより
入れ子構造を再現する
メイン空間
メイン空間にある箱の中を,球が並ん
でいる別の宇宙(universe1)に置換
Universe
5
満たす領域は常にvoid
universe.inp
Universeの例
[Cell]
Universe1で満たす
$ Main space
1 0 11 -12 13 -14 15 -17 FILL=1 (Fillする)
2 0 11 -12 13 -14 17 -16 FILL=2
9 -1 #1 #2
$ Universe 1
101 1 -1.00 -10 13 -14 U=1
102 0 #101 U=1
Universe1を宣言
$ Universe 2
201 2 -7.86 -10 13 -14 U=2
202 1 -1.00 #201 U=2
[Surface]
10 CY 5
PX -3
11 PX -6
12 PX 6
PX 9
13 PY -6
14 PY 6
15 PZ -6
16 PZ 6
17 PZ 0
Universe
6
講習の流れ
1. Universe
2. Lattice
3. 簡易Voxelファントム
4. Dicom形式からの変換
5. まとめ
Table of Contents
7
Latticeとは?
→ PHITSの中で使う
格子(lattice,繰り返し)構造
同じ形状のものが繰り返し並ん
でいるときに,個々の形状を全
て定義するのは大変!
基本構造のみ定義して,あと
はその繰り返しで表現する
Latticeの例
格子には直方体と六角柱が
あるが,基本的に使うのは直
方体のみ
Lattice
8
格子の定義方法
格子空間には他の構造物は定
義できない
格子の中身は直接定義できない
メイン空間ではなく,universeの
1つとして定義するのが便利
別のuniverseで満たす(fillする)
必要がある
Universeを2つ以上使った2重入れ子構造にする
fill
メイン空間
fill
Universe1
Lattice
Universe2
9
5
(2,2,0)
Y軸
[Surface]
1 rpp -5 5 -5 5 -1 1
2 rpp -6 6 -6 6 -2 1
99 so 100
101 rpp -1 1 -1 1 -1 1
201 sph 0 0 0 1
[Cell]
$ Main space
1 3 -8.96 1 -2
2 0 -1 fill=1
98 0 -99 2
99 -1 99
$ Universe 1
101 0 -101 lat=1 u=1
fill=-2:2 -2:2 0:0
22222
22222
22222
22222
22222
$ Universe 2
201 1 -19.32 -201 u=2
202 0 201
u=2
格子の定義
基本格子 (0,0,0)
(-2,-2,0)
-5
lattice.inp
-5
直方体タイプのLatticeを宣言
X軸
5
領域101
基本格子の領域を定義
格子に物質を満たす領域を指定(0は基本格子)
各格子に満たすuniverse番号(5×5×1の行列)
基本格子と座標を合わせる必要有
メイン空間で使う領域は,必ず定義しておく必要有
Lattice
10
格子の中身の変更
lattice.inp
[Cell]
$ Main space
1 3 -8.96 1 -2
2 0 -1 fill=1
98 0 -99 2
99 -1 99
$ Universe 1
101 0 -101 lat=1 u=1
fill=-2:2 -2:2 0:0
32222
22222
22222
22222
22222
$ Universe 2
201 1 -19.32 -201 u=2
202 0 201
u=2
$ Universe 3
302 0 -99 u=3
1つ目の格子のみVoidに変更
変更前
(lattice.inp)
Lattice
変更後
(lattice1.inp)
11
講習の流れ
1. Universe
2. Lattice
3. 簡易Voxelファントム
4. Dicom形式からの変換
5. まとめ
Table of Contents
12
簡易Voxelファントムの作り方
① 単一の物質(骨・軟組織など)
Universe1 Universe2
で満たされたuniverseを作る
(void)
② ①で作ったuniverseを
Latticeを使って組み合わせ,
ボクセルファントムが入った
universeを作る
(water)
Universe3
(Aluminum)
③ ②で作ったuniverseを
メイン空間の一部にFillする
Universe10
(Voxel Phantom)
メイン空間
Simple Voxel Phantom
13
インプットファイル
robot.inp
[Cell]
$ Material universe
1 0
-99 u=1
2 1 -1.00 -99 u=2
3 2 -2.70 -99 u=3
$ Voxel universe
101 0 -101
lat=1 u=10
fill=0:4 0:4 0:4
11111
12121
12121
11111
11111
… 以下,4回繰り返し
$ Main space
201 0 -201 fill=10
202 0 201 -202
203 3 -8.96 202 -203
204 0 -99 201 203
205 -1 99
基本格子(この場合は1つ目
に定義する領域)の面
十分に大きい領域であれ
ばどこでもよい
X正方向,Y正方向,Z正方向
(図の左下から始まる)
[Surface]
$ fundamental voxel
101 rpp -5 -3 -5 -3 -5 -3
99 so 100
$ Main space
201 rpp -5 5 -5 5 -5 5
202 rcc 0 0 -5 0 0 4 8
203 rcc 0 0 -6 0 0 5 9
z y
x
Simple Voxel Phantom
14
物質の追加・変更方法
robot.inp
[Cell]
$ Material universe
1 0
-99 u=1
2 1 -1.00 -99 u=2
3 2 -2.70 -99 u=3
4 3 -8.96 -99 u=4
$ Voxel universe
101 0 -2 1 3 -4 5 -6
lat=1 u=10
fill=0:4 0:4 0:4
… (始めの4ブロック)
11111
11111
11411
11111
11111
$ Main space
201 0 -201 fill=10
202 0 201 -202
203 3 -8.96 202 -203
204 0 -99 201 203
205 -1 99
ファントムの頭を水から銅に変更する
変更前
(robot.inp)
Simple Voxel Phantom
変更後
(robot1.inp)
15
線量計算結果
robot-heat-xz.eps
robot-heat-reg.out
x: Serial Num. of Region
y: Heat [MeV/source]
h: x
n
n
y(total),l3 n
# num reg
volume
heat
r.err
1
2 1.0000E+00 9.5978E-01 0.1277
2
3 1.0000E+00 3.4847E+01 0.0000
3
4 1.0000E+00 5.1924E+01 0.0000
regメッシュを用いた
[t-heat]計算
各領域別(手足・胴・頭)の
線量を計算
xyzメッシュを用いた
[t-heat]計算
ファントム内の線量分布を可視化
腫瘍部分や重要臓器などに
ROIをかけた線量計算が可能
Simple Voxel Phantom
16
講習の流れ
1. Universe
2. Lattice
3. 簡易Voxelファントム
4. Dicom形式からの変換
5. まとめ
Table of Contents
17
Dicom形式(バイナリー)
1つのスライスに対するデータ(sample001.dcm)
① Header (撮影日時,ピクセルサイズなどの情報)
② CT値(1,1→2,1→3,1→ … → nx-1, ny → nx, ny)の順番
このファイルがスライス数入ったフォルダで1つの物体を表現
1つのファイルを表示
フォルダ全体のデータを3D表示
Dicom形式からPHITS入力形式に変換する必要有
(CT値・バイナリ) (Universe番号・テキスト)
Dicom to PHITS
18
変換プログラム(dicom2phits)
Dicom形式のデータをPHITS形式のボクセルデータに変換
DICOM2PHITSの使い方の詳細は「DICOM2PHITSの使い方」を参照
phits/utility/dicom2phits/phits-lec-dicom2phits-jp.ppt
①入力ファイルを作成(dicom2phits.inp)
"data/HumanVoxelTable.data"
"DICOM/"
"PHITSinputs/"
1 20
70 430 90 460
4 4 1
0
0
1
変換テーブルの指定
指定ディレクトリ内に含まれるDICOMファイルを自動判別
PHITSインプットを格納するディレクトリを指定
指定した番号範囲のスライスファイルを読み込む (1<=z<=20)
DICOMデータの一部を切り出してボクセル化 (70<=x<=430, 90<=y<=460)
画像を粗くする(分解能を下げる)ことが可能 (x方向4個、y方向4個で平均)
原点オプション 0:ボクセル中心 1:DICOMヘッダーから抽出
PHITSパラメータ最適化オプション 0:最少 1:x線治療 2:粒子線治療
スライス読み込む順指定 +1:昇べき -1:降べき 原点オプション1では無視
②実行 (Windows) dicom2phits_win.batにdicom2phits.inpをドラッグ&ドロップ
(Mac) dicom2phits_mac.commnadをダブルクリック、現れる窓にdicom2phits.inpと入力
⇒ PHITSinputs/ディレクトリにサンプルインプット生成
DICOM2PHITS HowTo
19
読込の高速化
目的
PHITSでは一度インプットファイルを全てバイナリー化してから再読込
巨大なボクセルデータをあらかじめバイナリー化して読込時間短縮!
手順
① [Parameters]セクションのivoxelを有効にする(cを消す)
ivoxel = 2
# LatticeのFill部分をバイナリー化としてfile(18)に出力させるオプション
file(18) = voxel.bin # 出力するバイナリーファイルのファイル名
② PHITSを実行する → Binary file was successfully generated!!
③ ivoxel = 1に変更し,Latticeを定義するinflコマンドをコメントアウト
ivoxel = 1 # LatticeのFill部分をfile(18)から読み込むオプション
$ infl:{voxel1.inp}
Dicom to PHITS
高速化!
20
講習の流れ
1. Universe
2. Lattice
3. 簡易Voxelファントム
4. Dicom形式からの変換
5. まとめ
Table of Contents
21
まとめ
① Voxelファントムは,UniverseとLatticeを組み合
わせて作成
② Dicom形式は,別プログラム(DICOM2PHITS)を
用いてPHITS入力形式(テキスト形式)に変換
③ ivoxelパラメータを設定することにより読込を高
速化
Summary
22
高分解能ファントム利用時の注意点
全身を高分解能でボクセル化すると使用メモリが膨大になり実行できなくなる
例)全身(180cm×30cm×50cm)を1mm3でボクセル化すると,2億7000万個の
ボクセルが必要→ 1CPUあたり最低5.4GBのメモリが必要(約20Byte/ボクセル)
初期設定のPHITSは,約2GBしかメモリを使うことができない
対策方法
“src”フォルダにある”param.inc”を変更し,全てのファイルを再コンパイル*する
• mdasの変更: PHITSで使用する総メモリ数(Byte)/8 (32bit機は特に上限値に注意)
• latmaxの変更: 最も大きなlattice数+1(複数Latticeを使う場合は,その最大値)
• 必要に応じて型宣言及びコンパイラオプションを追加: 詳細は次ページ参照
メモリが(物理的に)足りない場合
ボクセル化する領域を頭・胴・足などに分割し,無駄な領域を小さくする
複数のピクセルをまとめてボクセル化し,分解能を下げる
*Windowsの場合,Stack memoryの関係からIntel Fortranではエラーが起きる場合
があるので,gfortranの方がよい。Linux&MacはIntel Fortranでも動作します
23
補足資料①
Voxel数が約5000千万個を超える場合は,様々な対策が必要
例)JMファントム(ボクセル数:約1.5億個)を6分割(最大セルのボクセル数:約4千万個)にした場合
Fortranソースパラメータの変更
param.inc
integer*8 mdas,mcmx,mci,mmdas,mmmax,nbnds,mct ! 4バイト整数の最大値(2147483647)超え対策
parameter ( mdas = 500000000 ) ! PHITSで使用する総メモリ数(Byte)/8, 64bit機の導入必須
parameter ( latmax = 47000000 ) ! 1セルあたりの最大ボクセル数
angel00.inc
integer*8 mdas,mmdas,mmmax
! 4バイト整数の最大値(2147483647)超え対策
parameter ( mdas = 350000000 ) ! ANGELで使用する総メモリ数(Byte)/8
コンパイラオプションの追加(Intel Fortranの場合)
makefile
F77
= ifort
FCFLAGS = -noautomatic -mcmodel=large -i-dynamic
Appendix
-i-dynamic : Libraryを動的リンク
-mcmodel=large : メモリの使用制限なし
ただしLinux版のみ対応なので,巨大ファン
トムを利用する場合はLinuxシステムが必須
24
補足資料②
Voxelファントムの向きを変えるには,基本単位となるvoxel
を定義する際の順番を変える必要がある
lattice.inp
[ S u r f a c e ] (一部抜粋)
101 px -1
102 px 1
RPPを各面
103 py -1
104 py 1
に分解
105 pz -1
106 pz 1
[ C e l l ] (一部抜粋)
$ Universe 1
101 0 -102 101 -104 103 -106 105
lat=1 u=1
順番が
fill=-2:2 -2:2 0:0
重要!
32222
22222
22222
先に書く面
22222
22222
が正方向
RPP, BOX
と同じ
-102 101 -104 103 -106 105
X正方向,Y正方向,Z正方向
101 -102 -104 103 -106 105
X負方向,Y正方向,Z正方向
-102 101 103 -104 -106 105
X正方向,Y負方向,Z正方向
101 -102 103 -104 -106 105
X負方向,Y負方向,Z正方向
Lattice
25