Topas——基于Geant4的放射治疗蒙特卡罗算法模拟工具
本文内容参考Joseph Perl 的线上会议Introduction to TOPAS,视频详情可见于Topas会议录屏,该视频会议内容主要介绍Topas功能、软件架构、工作流程、参数设定、物理模型、具体案例等,对TOPAS的基本入门使用方法以及使用规定作出阐述。
关于Topas
总的来说,topas是一个用于调用Geant4的小程序,如果你也被Geant4恶心到了,那不如试试使用topas解决你想研究的高能物理问题
TOPAS 包装并扩展了 Geant4 模拟工具包,使医学物理学家更容易使用各种形式的放射治疗的高级蒙特卡罗模拟。 TOPAS 可以对 X 射线和粒子治疗治疗头进行建模,基于 CT 图像对患者几何形状进行建模,对剂量、能量等进行评分,保存和回放相空间,提供高级图形,并且是全四维 (4D)处理治疗期间光束传输和患者几何形状的变化。 TOPAS 用户配置预先构建的组件(例如喷嘴、患者几何形状、剂量测定和成像组件)来模拟各种放射疗法,而无需了解底层 Geant4 模拟工具包或任何编程语言。模拟的所有方面,包括所有 4D 行为,都由独特的 TOPAS 参数控制系统控制。
学习前提
使用Topas不需要掌握C++或其他编程语言,但是需要会Unix( Linux / MacOS )的基本知识,以及以下技能:
- 如何打开
terminal
窗口; - 如何使用纯文本编辑器(比如emacs、vi、pico、TextEdit、Notepad++);
如果用了高级文档编辑器,里面所隐藏的字符会导致编译错误
ps:但我觉得就用电脑自带的txt文本编辑器就可以了 - 如何使用cd进入某个路径;
- 如何设置环境变量;
- 如何调用一个可执行程序:如
/Application/topas/bin/topas
;
放射物理相关知识:
明白剂量的相关基本概念:dose
、dose to water
、dose to material
、fluence
安装Topas
Topas的具体安装步骤在其官网的Installation guide(外网)上就有详细步骤,可以兼容Linux(Centos、debian、Ubuntu),以及MacOS等多个Unix系统,但是不能在Windows上运行。
具体安装步骤可参照官网上的流程,其中Ubuntu用户也可以参考本文的安装过程。
获取topas.tar.gz
获取方法一
推荐使用该方法进行安装,可以获取到完整的Topas资源(包括正版使用license、所有历史版本的Topas、以及可以加入Topas用户论坛),但是缺点是需要先注册Topas账号,然后听完一个两小时的线上会议后自动开启使用权限,申请周期以及耗时比较久。急着马上要用Topas可以直接看获取方法二。
首先需要访问Topas官网(外网),或者Google搜索 Topas mc 第一个就是,打开官网后点击Registration for license
如实填写完成该表单后,等待Topas给回复邮件(他说大概等24h才会有邮件回复,可是我等了3天才收到回复。。。)
不出意外的话,一段时间之后会收到 Joseph Perl 回复的邮件,可能让你先等待申请 list 满12个人之后才会开这个会议,比如这样(这种情况的话就只能先等等了):
或者直接收到Joseph Perl的参会邀请,比如这样:
收到会议邀请后,听完2 hours的介绍会议,Topas安装包的获取权限会自动打开,这个会议其实讲的还蛮有用的,虽然是全英语,但还是比较好理解的,听完一遍之后就能直接上手Topas。
获取方法二
百度网盘(提取码:tpsf)
配置unix环境
本文采用安装在Windows10上的Ubuntu20.04虚拟机 VMWare 作为操作系统环境,也可以使用 硬件安装的Ubuntu系统 或 Topas官网提供的"Additional Installation Notes for Windows Subsystem for Linux" 方法
在终端使用apt依次安装libexpat1-dev、libgl1-mesa-dev、libglu1-mesa-dev、libxt-dev、xorg-dev、build-essential、libharfbuzz-dev这几个包:
安装Topas
接着cd进入上一步获取到的两个topas_3_8_1.tar.gz的安装包的路径,使用cat指令合成一个压缩包:
cat topas_3_8_1_debian9.tar.gz.part_* > topas_3_8_1_debian9.tar.gz
使用tar指令解压该压缩包,得到topas:
tar -zxvf topas_3_8_1_debian9.tar.gz
将topas文件夹移动到主目录,就得到了~/topas:
安装Geant4
在主目录下新建一个文件夹G4Data
在~/G4Data目录下执行wget指令,获得所有Geant4文件包
wget -4 https://geant4-data.web.cern.ch/geant4-data/datasets/G4NDL.4.6.tar.gz
wget -4 https://geant4-data.web.cern.ch/geant4-data/datasets/G4EMLOW.7.13.tar.gz
wget -4 https://geant4-data.web.cern.ch/geant4-data/datasets/G4PhotonEvaporation.5.7.tar.gz
wget -4 https://geant4-data.web.cern.ch/geant4-data/datasets/G4RadioactiveDecay.5.6.tar.gz
wget -4 https://geant4-data.web.cern.ch/geant4-data/datasets/G4PARTICLEXS.3.1.1.tar.gz
wget -4 https://geant4-data.web.cern.ch/geant4-data/datasets/G4SAIDDATA.2.0.tar.gz
wget -4 https://geant4-data.web.cern.ch/geant4-data/datasets/G4ABLA.3.1.tar.gz
wget -4 https://geant4-data.web.cern.ch/geant4-data/datasets/G4INCL.1.0.tar.gz
wget -4 https://geant4-data.web.cern.ch/geant4-data/datasets/G4PII.1.3.tar.gz
wget -4 https://geant4-data.web.cern.ch/geant4-data/datasets/G4ENSDFSTATE.2.3.tar.gz
wget -4 https://geant4-data.web.cern.ch/geant4-data/datasets/G4RealSurface.2.2.tar.gz
wget -4 https://geant4-data.web.cern.ch/geant4-data/datasets/G4TENDL.1.3.2.tar.gz
或者,通过百度网盘下载以上Geant4资源。再将下载到的所有.tar.gz文件导入~/G4Data文件夹中。
下载完成后,使用ubuntu指令解包:
find . -name "*.tar.gz" -exec tar -zxvf {} \;
最后得到的所有Geant4文件如下所示:
设置Geant4环境
在任意位置Ctrl+Alt+T
打开terminal
,输入指令进入编辑模式:
vim ~/.bashrc
打开.bashrc
文件如下图所示:
按i
进入--Insert--
模式,输入
#topas
export TOPAS_G4_DATA_DIR=~/G4Data/
然后按Esc
退出编辑,输入:wq
回车 保存并退出,并输入
source ~/.bashrc
激活路径,使得Geant4的路径生效,就大功告成啦!
接下来,跑一个案例试试吧~
进入目录~/topas/examples/SpecialComponents
,在该目录下打开Terminal
,输入指令,跑一个多叶准直器MLC的案例看看效果:
../../bin/topas MultiLeafCollimator_sequence.txt
敲回车后出现以下提示,说明topas和Geant4都配置成功:
跑出来的OpenGL
效果如下所示:
或者,也可以在~/topas
目录下使用指令,一次性测试所有标准案例的运行效果:
source rundemos.csh
使用Topas
Topas的最完整的使用手册参见[Topas User Guide](https://topas.readthedocs.io/en/latest/)
一个简单的 HelloWorld 程序 OneBox.txt
在Topas中,运行程序的方式是通过修改各种参数文件来告诉Topas你想进行什么样的仿真。在topas安装目录~/topas/examples/Basic中包含有几个OneBox开头的txt文件,用于介绍最基础的Topas参数控制文件的编写方式,以下为OneBox.txt的示例:
# Simplest TOPAS example.
# A box in a beam with EM physics.
s:Ge/MyBox/Type = "TsBox"
s:Ge/MyBox/Material = "Air"
s:Ge/MyBox/Parent = "World"
d:Ge/MyBox/HLX = 2.5 m
d:Ge/MyBox/HLY = 2. m
d:Ge/MyBox/HLZ = 1. m
d:Ge/MyBox/TransX = 2. m
d:Ge/MyBox/TransY = 0. m
d:Ge/MyBox/TransZ = 0. m
d:Ge/MyBox/RotX = 0. deg
d:Ge/MyBox/RotY = 0. deg
d:Ge/MyBox/RotZ = 0. deg
sv:Ph/Default/Modules = 1 "g4em-standard_opt0"
s:Gr/ViewA/Type = "OpenGL"
i:Gr/ViewA/WindowSizeX = 1024
i:Gr/ViewA/WindowSizeY = 768
b:Gr/ViewA/IncludeAxes = "True"
d:Gr/ViewA/Theta = 55 deg
d:Gr/ViewA/Phi = 20 deg
s:Gr/ViewA/Projection = "Perspective"
d:Gr/ViewA/PerspectiveAngle = 30 deg
u:Gr/ViewA/Zoom = 2.
b:Ts/PauseBeforeQuit = "True"
通过在终端调用topas执行仿真:
得到仿真结果:
Topas中txt参数文件的编写规则
Topas指令文件中的语句,和Geant4中的C++宏命令相似,但是并不相同
每一条指令独立并发控制,每条指令的顺序不影响执行结果,比如以下两种情况执行效果相同:
对大小写不敏感,以下同一列都是相同的表达效果:
Topas的参数语句构造规则
Parameter_Type : Parameter_Name = Parameter_Value # Optional comment
(1)Parameter_Type
写在每个参数语句前的最前端,用表示数据类型的字符缩写来控制,用于核实与Parameter_Value的数据类型是否一致。因为在Topas仿真中,一个小的错误就可能导致长达一天时间的仿真白费,因此Topas加入了这个控制参数来校验每条参数语句是否正确——如果在Parameter_Type字段写了一个代表"String"的"s:",而后面的Parameter_Value字段却写了一个数字,则Topas会在开始仿真前报错这个问题。
以下为常见几种Parameter_Type的缩写含义:
来看几个具体例子:
有时候还会在 " : " 之前加入一个 " v "来把这个参数描述成一个Vector向量,比如:
除此之外,也可以在 " : " 之前加入一个 " c ",代表这个参数作为变量,在后续的 TOPAS GUI
部分可以控制这个变量
(2)Parameter_Name
Parameter_Name一般由三部分组成,即 部分一/部分二/部分三
,其中部分一
和部分三
一般有固定的控制参数,部分二
可以由自己构造,主要是为了把控部分一
和部分三
是在对同一个部分二
进行描述。比如下面这个例子,其中的Parameter_Name包括:Ge/MyComp/Type、Ge/MyComp/Material、Ge/AnotherComp/Parent、Ge/AnotherComp/RMax等,其中的Ge
作为部分一
;Type、Material、Parent、HLX、TransX
等作为部分三
都是固定的控制参数名词;而MyComp、AnotherComp
都作为部分二
是自定义的
以下为部分一
的所有控制参数,及其相应的解释含义:
参数 | 解释 |
---|---|
Ma | for Materials |
El | for Elements |
Is | for Isotopes |
Ge | for Geometry Components |
So | for Particle Sources |
Ph | for Physics |
Vr | for Variance Reduction |
Sc | for Scoring |
Gr | for Graphics |
Tf | for Time Features |
Ts | for TOPAS overall control |
再以其中的Ge
为例说明部分二、部分三的定义方法——如果在部分一定义了一个Ge
,也就是选择创建一个几何原件(Geometry Components),然后在部分二可以自己定义这个几何原件的名字,比如说就叫MyComp
;接着,在部分三就要对MyComp
的各种取值进行定义,最关键的一些定义就是:
1.这个MyComp
是个什么类型的原件——定义Type
为World
(Defualt值)、或TsBox
、或TsCylinder
等;(具体参见Topas User Guide)
2.这个MyComp
是个介质是什么——是空气Air
、或是水G4_water
等;
3.这个MyComp
的大小——由HLX
、HLY
、HLZ
控制;(HL即Half Length)
4.其他:旋转角度、半径、内径、外径、平移等参数详情参见Topas User Guide
(3)Physical Models
通过一条指令控制,包含所有模型情况:
sv:Ph/Default/Modules = 6 "g4em-standard_opt4" "g4h-phy_QGSP_BIC_HP" "g4decay" "g4ion-binarycascade" "g4h-elastic_HP" "g4stopping"
但是用越多的模型,仿真需要的时间越久,一般情况下就用一个最简单的 “g4em-standard_opt0” 模型,先把大致情况给做出来,再以此为基础做更具体的模型仿真。也就是通过这条指令:
sv:Ph/Default/Modules = 1 "g4em-standard_opt0"
(4) 引用其他参数文件
在最开始,介绍了一个简单的 HelloWorld 程序 OneBox.txt ,在这时如果我们想在这个OneBox的基础上再做一些改变、或者是一些新增,那么可以在一个新的OneBoxRotate.txt
中直接调用:
includeFile = OneBox.txt
然后,如果想把这个Box旋转一定角度的话,可以在此基础重写RotX
参数:
d:Ge/MyBox/RotX = 45. deg
除此之外,还可以新增一些参数,或者重载includeFile里面的参数
(5)Topas中的数学表达式
Topas只支持最基础的数学运算 +
、 -
、 *
,并且每个运算符的前后必须有空格,没有 /
是为了避免除数为零导致的错误;同时需要保持两个运算的数具有相同的单位。总而言之,就是尽量不要在Topas参数文件里写运算符。