张建英,孙 菁,王 芸
1 复旦大学附属中山医院放疗科,上海市,200032
2 上海市杨浦区市东医院放疗科,上海市,200438
RayStation治疗计划系统脚本的进阶应用
【作者】张建英1,孙 菁1,王 芸2
1 复旦大学附属中山医院放疗科,上海市,200032
2 上海市杨浦区市东医院放疗科,上海市,200438
该研究在RayStation4.0计划系统平台上,探讨了以下功能的实现方法:将治疗计划的各感兴趣区域名称等信息传递给Word文档形成放疗计划处方文件;再将该文件通过UI界面传递给 RayStation计划系统用于计划中评估;最后将评估结果传回Word处方文件,形成计划结果报告Word文件。研究结果表明,RayStation脚本可以实现与Word的数据交换;在脚本中控制Word的内容和运行。因此,通过RayStation脚本实现系统与第三方软件的交互、扩展其本身功能是可行的。
治疗计划;脚本;应用
RayStation(RaySearch Laboratories AB, Stockholm, Sweden)系统是刚进入我国的肿瘤放射治疗计划系统。该系统提供了脚本功能,以往的研究已经探明了脚本的基本应用方法,也表明有可能通过脚本与第三方软件进行交互,实现功能的扩展。
在放射治疗计划设计临床上,通常需要进行计划的处方和评估工作。随着放疗向精细化的方向发展,放疗处方和评估的项目也越来越多。这些填写的工作如单靠手工完成,极易产生差错。比较理想的方法是通过数据的传输来自动完成,并将相关数据存储为通用文档(如Word文档),并保存于电子病历中。
本研究将微软办公软件Office中的Word作为第三方软件,以实现放疗计划设计中的处方和评估的数据传输和交互为目标,具体研究RayStation系统的脚本进阶应用。
1.1软件
本研究使用RayStation4.0计划系统。系统安装时,也同步安装了Ironpython2.7编程语言和.NET Framework4.0框架结构;还同步安装了微软OFFICE2010办公系统专业版,具备 VBA(Visual Basic for Applications) 功能。
本研究首先建立了一个标准计划处方Word文档。文档中间的两行表格为剂量约束输入表。放疗治疗计划设计基本流程如下:一、剂量师在勾画完各感兴趣区域(ROI)后,调用脚本填写Word文档中患者姓名和放疗编号等基本信息,将所有感兴趣区域名称传递给剂量约束输入表中感兴趣区域栏的下拉选择框,最后将文档以患者放疗编号为名称保存;二、主管医生用约束输入表填写单个放疗处方评估条件,通过“添加”按键将处方条件写入下方的计划处方表,并保存文件;三、物理师在计划设计过程中,通过脚本把患者的计划处方文件打开,把计划处方表的内容填入RaySation系统计划评估界面的Clinical Goal中;四、物理师在医生批准计划后,将实际的计划评估结果导入到患者计划处方文件中,并将“计划处方”改为“计划评估”,并关闭全部的“按键”,保存计划评估文件。
可以看出,本研究实际需要脚本完成的是第一、三、四步的工作。
1.2 方法
1.2.1 基本计划处方文件的形成
在本研究中,形成计划处方文件的基础是建立脚本编程语言Ironpython与Word的联系。也就是在脚本中使用Office系统一些类库,在Windows层面操作Word应用软件,达到操作Word文件、修改其内容的目的。
Ironpython本身就是一种基于Microsoft .NET的Python语言,因此它和.NET Framework具有良好的兼容性。微软的Office办公软件在安装时,如果安装了.NET Programmability Support(.net可编程支持),就可以在Ironpython中直接使用Office主 Interop 程序集。具体的做法是在Ironpython的脚本开始加入clr. AddReference("Offce"),clr.AddReference("Microsoft. Office.Interop.Word"),from Microsoft.Office.Interop. Word import *,以此获得Word应用(Application)的控制以及该对象的各种属性和方法。如对这种引用的方式理解存在困难,可以完全不用理会其原理。
本研究建立的标准处方文件中包含了诸多Word对象,如表格、下拉输入框、命令按键等。为了在Word中操作这些对象,在脚本开始还需加入clr.AddReference("Microsoft.Vbe.Interop"), from Microsoft.Vbe.Interop import *两条语句,以建立Ironpython脚本与VBA的联系。
本研究使用tmp_application=ApplicationClass( Visible=True和mydoc=tmp_application.Documents. Open(‘d:plan.docm’)获得了标准计划文件plan. docm在Ironpython中的对象mydoc,也获得了Word在当前系统中的应用运行实例对象tmp_application。
标准处方文件中存在多个相同类型的Word对象,比如表格就有三个。本研究采用了遍历标准文件全部表格,并根据表格标题来选定所需的表格的方法。具体语句如for my_table in mydoc.Tables: 和if my_ table.Title == "info":。标准文件里表格标题可以通过表格属性里的“可选文字”里的标题一栏设定。这样可以避免使用表格序号引用表格,当表格格式发生改变或表格由于“删除”、“粘贴”等操作导致序号发生改变时,代码无需改变。
从Raystation计划系统中获取患者姓名、放疗编号的方法在过去的脚本研究中已经完成了。本研究使用“my_table.Cell(2,2).Range.Delete(1) ”先将标准计划文件中基本信息表中对应单元的内容清空,再用“my_table.Cell(2,2).Range.insertAfter(patient. Physician) ”把来自Raystation的基本信息填入。
如上所述,本研究使用“ROI”作为剂量约束输入表中感兴趣区域栏的下拉选择框的标题,用my_ ContentControl.DropdownListEntries.Add(zjy_i.Name)将已经勾画的器官名称传递给下拉列表选项。当然,上述语句中 zjy_i所代表的是来自RayStation的器官对象集中的一个元素,也就是RayStation中的一个器官对象。
在完成各项输入后,本研究使用m y_ filename="d:\"+patient.PatientID组成以患者放疗编号为名称的文件名;使用mydoc.SaveAs(my_filename)保存计划处方文件;使用tmp_application.Quit()释放Word程序。
1.2.2 计划处方文件的导入
本研究通过脚本在RayStation中导入计划处方文件的基本思路是,通过鼠标在RayStation界面上的动作,调用RayStation用户界面,根据计划处方文件里计划处方表的内容,建立一个Clinical Goal的条件。
在本研究中,计划评估有四种基本界面布局,分别为A3、A4、B4、B5模式,而调用Clinical Goal的命令键则分别隶属于这四个界面布局。为了使得脚本在任意界面布局情况下都可以调出添加界面,本研究在脚本中使用了“Try:… except:… finally:…”结构,分别对四个界面做尝试,避免了脚本运行中因调用过程出错导致异常退出。调用添加Clinical Goal的具体对象为connect.get_current('ui'). Workspace. NotifyingContentControl. A3.TabControl_ TabPages['DVH'].ClinicalGoals.Button_AddGoals。
按RayStation的设计,添加Clinical Goal时必须依次选定感兴趣区域(ROI)、选定约束类型、选定约束中体积的类型、确定约束关系,最后再填写具体数值。
在本研究中,通过connect.get_current('ui'). RayRadionButton['ROI'].Click()可以在添加界面中选定ROI按钮;然后按照1.2.1所述方法,在计划处方表中使用mytable.Cell(i,1).Range.Text提取出第i行对应的ROI名称,将其保存于变量zjy_z中,再通过在connect.get_current('ui'). ComboBoxItem[zjy_z].Select()在添加界面的ROI下拉框中选定对应的ROI。需要特别指出的是,Word中直接提取的zjy_z后面包含一些特殊字符,如换行符等,需要使用字符串截取函数将其去除,否则ROI下拉列表中将会找不到匹配的ROI;在调用ROI下拉框之前,必须先使用ToggleButton.Click()命令先将下拉框展开,否则下拉框的选项也无法使用(被选择)。
作为一个计划处方约束或要求,通常有以下几种表达方式。一,剂量体积约束,即达到或超过某一剂量的体积不大于或小于某一体积,这一体积可以是绝对体积也可是相对体积;二,体积剂量约束,即达到或超过某一体积的剂量不大于或小于某一剂量;三,特殊约束,即希望最大剂量、最小剂量或平均剂量大于或小于阈值。
本研究为了区分这几种情况,在计划处方文件剂量约束输入表中设置了约束类型一栏。当约束类型为V时,表示约束对应的求解阈值是体积;为D时,代表约束对应的求解阈值是剂量。比如临床约束肺20 Gy的体积小于30%,通常用“V2000<30%”,V就是本研究中的约束类型;临床用“Dmax<50 Gy”,限制最高量小于50 Gy,D就是这类约束在本研究中的约束类型。约束输入表的单位1会根据约束类型更改,对于特殊约束的处理是将其约束条件的单位1设为“max”, “min”和“avg”。
以约束条件“V2000<30%”为例,本研究脚本读出约束条件单位1为cGy,判断其为体积约束,使用.RayRadionButton['Volume at dose'].Click()来选择剂量体积约束;继而根据单位2为%,了解到要求的是相对体积,不需使用.PlanningGoal._cGy_ dose_1. CheckBox设置;随后根据关系为<,确定使用.RayRadionButton['At most'].Click()设置关系;最后使用.TextBox_GoalVolume[0].Text=30和.TextBox_ DoseLevel[0].Text=2000设置约束数值。
当然,具体的逻辑关系比举例要复杂很多,需要进行较为复杂的调试和在程序中设置一些错误处理机制。约束条件输完后,本研究使用connect.get_ current('ui'). Button_Add.Click()进行添加一条Clinical Goal。
1.2.3 计划评估的导入
为确保从Clinical Goal中获取的结果数值能与计划处方表一一对应,脚本必须将计划处方表中的每一条约束条件改写为RayStation的Clinical Goal的文字表达,并将该文字表达与Clinical Goal中的表达进行比对。
依然以“V2000<30%”为例,在Clinical Goal中其文字表述为“At most 30.00 % volume at 2000 cGy dose”。本研究的脚本根据计划处方表中的约束关系为<,确定文字表述的第一个关键词为At most。研究根据单位1为%,确定约束为相对体积约束,而文字表述中相对体积数值保留两位小数。脚本使用"%.2f"% string.atof(zjy_z_data1)改写原约束条件中的相对体积数值(zjy_z_data1即为从计划处方表中某一行约束条件中获取的相对体积约束值)。最后将“% volume at”、“2000”、“cGy dose”等关键词依次连接起来。需要指出的是,关键词“cm3”需要使用编程中的转义方法,即使用“ cmxb3 volume at ”作为关键词;脚本中还需注意关键词中每个单词之间存在空格。
从Clinical Goal中获取当前计划的约束结果时的对象为.DataGridRow[j].TextBlock_Result.Text。这个对象的名称与Clinical Goal标题栏的名称并不一致。在本研究中,为了获取一个编程对象的属性和方法, 使用了“._ ”方法。例如,在调试中,使用“.DataGridRow[j]._ ”可以获取DataGridRow对象的全部属性,并在其中即可以发现有TextBlock_Result子对象。
在本研究中,对RayStation脚本的进阶应用使用主要体现在三个方面。一是在脚本中调用Office系统类库,建立了脚本和Word程序的应用接口;二是在脚本中使用“Try:… except:… fnally: …”结构实现了对程序的分支判别,也同时为脚本的应用提供了错误处理机制;三是在调式过程中使用“._ ”方法查找Raystation系统中各个对象的属性和方法。
在本研究中,RayStation计划系统应用脚本调用、控制了Word软件。其主要完成的工作任务从编程角度看可以分成两个方面,即通过对Word对象的属性和方法的引用实现了对控制Word文件控制;同时通过将计划系统对象和Word对象在脚本中共存的方式实现Word文件与计划系统的数据交换。本研究预设的主要功能已经实现。
本研究所示范的脚本功能只是提供了一种方法,一种可能性。事实上,在本研究的基础上,计划处方文件的界面还可以进一步优化。比如,对计划处方表中,可以对相同ROI的约束条件的第一栏进行合并,增加其可读性;还可以对计划处方表进行排序,尤其是可以根据ROI的性质(是否为靶区)排序等等。从理论上说,进阶运用RayStation脚本,已经可以开发出商业化的Word处方应用。
本研究的结果表明,通过Ironpython的脚本编程, RayStation中完全可以实现对Word文档的控制和对应的数据处理和交换。
在以往研究中,关于脚本的安全性、容错性的问题通过在脚本中设置错误预处理得到部分的解决。但是对于脚本多线程的问题还有待进一步研究。比如,RayStation脚本是否可以在系统背后运行,随时可以捕捉到RayStation计划发生改变的事件,然后可以自动填写计划处方文件的问题(也就是脚本运行过程中实现挂起的动作,等待计划系统进行触发后再唤醒继续执行脚本的问题)尚待研究。
但是,本研究已经提示RayStation系统脚本功能可以进一步开发,使用第三方软件对其扩展,实现原系统不具备的一些功能,也充分说明了RayStation脚本运用的前景。 尽管在本研究中只是使用了Word对象和方法,但是可以预期,RayStation脚本中也可以实现这样一些功能,如在脚本中调用Word的宏, 或者将Word的宏(或VBA程序)用Ironpython语言进行改写后直接在脚本中运行。这也说明RayStation脚本有可能在脚本环境中直接控制、调用第三方软件,把第三方软件作为自身功能的一个插件,实现类似DIY式的功能扩展。这些功能扩展将可能包括但不限于算法的优化、工作流程的规范化、治疗计划设计的自动化以及文档管理的自动化等等。因此,今后关于RayStation脚本的应用还有相当的研究工作可做。(限于篇幅,本文部分代码和文件可以作者邮件联系获取。)
[1] 张建英, 孙菁, 王芸. RayStation治疗计划系统脚本的初步应用[J].中国医疗器械杂志, 2013, 37(4): 297-300.
[2] Philips Medical System. Pinnacle3 Planning reference guide[M]. 9201-5136A-ENG Rev A. Fitchburg USA, 2008.
[3] RaySearch Laboratories AB. RayStation 3.0 Reference Manual[M]. Stockholm, Sweden, 2012.
[4] Mueller JP. Professional IronPython design and develop IronPython techniques[M]. Indiana, USA: Wiley Publishing Inc, 2010.
[5] Foord MJ, Muirhead C. IronPython in Action[M]. Greenwich, USA:Manning Publications Co, 2010.
Discussion to the Advanced Application of Scripting in RayStation TPS System
【Writers】Zhang Jianying1, Sun Jing1, Wang Yun2
1 Department of Radiation Oncology, Zhongshan Hospital Affliated to Fudan University, Shanghai, 200032
2 Department of Radiation Oncology, East City Hospital of Yangpu District in Shanghai, Shanghai, 200438
In this study,the implementation methods for the several functions are explored on RayStation 4.0 Platform. Those functions are passing the information such as ROI names to a plan prescription Word fle. passing the fle to RayStation for plan evaluation; passing the evaluation result to form an evaluated report fle. The result shows the RayStation scripts can exchange data with Word, as well as control the running of Word and the content of a Word fle. Consequently, it’s feasible for scripts to inactive with third party softwares upgrade the performance of RayStation itself.
Treatment Planning, Script, Application
R730.55
A
10.3969/j.issn.1671-7104.2014.06.022
1671-7104(2014)06-0463-03
2014-07-11
张建英,E-mail:shzjy@126.com