見出し画像

Pylinac のドキュメントを読んで(実践2例)

URL

https://pylinac.readthedocs.io/en/release-3.0/

読んでみたきっかけ

去年、WEBセミナーにて開催された ”実践的放射線治療人材育成セミナー” で、ちょこっとpylinacの話を聞いたような気がします。それで、Githubにてpylinac を見つけました。ドキュメントの最初の1行から「Pylinac は、Python プログラマーに TG-142 品質保証 (QA) ツールを提供します。」と書いてあったので、興味を持ちやってみようと思いました。ドキュメントは、ここ で読めます。

論文の要旨

Pylinacは、線形加速器(Linac)から生成された画像やデータを自動的に分析するPythonの品質保証(QA)ツールです。放射線医学分野のプログラマーや非プログラマーが使用できます。Pylinacは、PDFレポートの生成、ファントムの自動登録、画像の読み込みなど、さまざまな機能を提供します

現場でやっている医学物理士の感想

Pylinac General Overview

What is pylinac?

「これらのデータは通常、AAPM TG-142や同様のTGで概説されたテストに従います。例としては、毎週または毎月行われるMLCの「ピケットフェンス」テストがあります。
Pylinacは画像やデータを取り込み、数値結果、分析結果を示すプロット、数値データとプロットデータの両方を含むPDFを出力することができます。」

What is pylinac?

データ取り込み~文書化することができるんですね。定期的なQAを一部でもpylinacに置き換えられたらいいでしょうね。

What is pylinac NOT?

「pylinac は、不正確な出力に対して責任を負いません。不正確なデータを入力した場合、またはアルゴリズムが不正確な場合、クリニックで使用するソフトウェアと同様に、常に既知の方法論(自動または手動)に対してpylinacを検証する必要があります。」

What is pylinac NOT?

よーく存じております。「自己責任」ですね。pylinacのコミッショニングをしっかりやるということですね。

「Pylinacは商用ソフトウェアではありません。MITライセンスという非常に緩やかなライセンスでオープンソース化されており、公的にも私的にも、あるいは商用アプリケーションでもロイヤリティフリーで使用することが可能です。」

What is pylinac NOT?

素晴らしいですね。私も何かお手伝いすることがあればいいんですが。

Philosophy、Algorithm Design Overview、Module Design は、「少ないコード量で多くの動作を表現する、短く簡潔で読みやすいスクリプト」をモットーに開発されているということなんでしょうか。しっかり設計されているんですね。

Installation

インストールは簡単にできました。

Get a Distribution Stack(環境設定)

私のpython環境は、Windows10、Winpython 3.11.1、Visual Studio Code 1.77.3、pylinac 3.10.0、です。

実践してみたのは、Winston-Lutz、Catphanの2例です。どうにかこうにか出来ました。

Winston-Lutz Test

Winston-Lutz モジュールは、小さな放射線照射野と BB から撮影された EPID 画像を分析して、BB から照射野 CAX までの 2D 距離を決定します。さらに、ガントリー、コリメータ、および寝台のアイソセンタ サイズはすべて、BB がアイソセンタになくても決定できます。分析はWinkler ら 、Du ら、 Low らに基づいています 。

Winston-Lutz Test

論文に基づいているんですね。

ちなみに,私が作成したスクリプトを書いておきます。
”my_directory = r'c:\Users\...”は、ご自分の環境のパスに変更してください。

# pylinac winston-lutz
from pylinac import WinstonLutz

my_directory = r'c:\Users\放射治療研究用PC\Documents\Python\pylinac\winston_lutz'
wl = WinstonLutz(my_directory, use_filenames=True) # Insert use_filenames=True

wl.analyze(bb_size_mm=2) # 5mm -> 2mm Change!

# plot all the images
wl.plot_images()
# plot an individual image
#wl.images[3].plot()

# print to PDF
wl.publish_pdf('0428_wl.pdf')

TM-WinsとPylinacで比較しましたが、両者はほぼ一致しました。これまで比較できる検査方法が無かったので、ちょっと安心しました。

CT & CBCT QA (CatPhan)

「CBCT モジュールは、CT または CBCT の品質保証を行うときに取得された CatPhan 504、503、または 600 の DICOM 画像を自動的に分析します。」

CT & CBCT QA (CatPhan)

うちのLinacに付属していたファントムは、CatPhan504でした。
CBCTでファントムを撮影し、その画像をpylinacのプログラムから呼びだします。しかし、当初テストで使っていた何枚かの画像にカウチの金属が入っていてエラーとなり、結果が表示されませんでした。ファントムをずらし、金属アーチファクトのないCBCT画像では問題なく解析できました。

同様に、私が作成したスクリプトを書いておきます。
”zip_file = r"C:\Users\...”は,ご自分の環境のパスに変更してください。

from pylinac import CatPhan504, CatPhan503, CatPhan600, CatPhan604
import os # osモジュールをインポートすることを忘れずに
import datetime

# for this example, we'll use the CatPhan504
# zip fileを用いた場合 newct.zip
# ご自分の環境のパスに変更してください.
zip_file = r"C:\Users\放射治療研究用PC\Documents\Python Scripts\CBCT\newct.zip"
cbct = CatPhan504.from_zip(zip_file)

cbct.analyze()

now = datetime.datetime.now()
formatted_date = now.strftime('%Y%m%d_%H%M%S')

# 相対パスでファイルに書き込み
file_path = os.path.join(os.path.dirname(__file__), 'CBCT_result_' + formatted_date)

# 相対パスでファイルに書き込み
with open(file_path + '.txt', 'w') as f:
 f.write(cbct.results())
print(cbct.results())

Winston-Lutz Testもそうなんですけど、手作業でするよりも断然早い、客観的、間違いがない、なにより楽という点がメリットですね。

これからの課題(私がPylinacを使う場合)

今のところ、定期で行っているQAには使っていないのですが、今後当院はLinacの更新を控えているので、「新QAシステムは間違いなく動いているか」の確認用として使いたいなと思っています。

私の施設では一つハード的な問題があって、それはセキュリティの問題で放射線治療のPCのデータを取り出しにくいということです(USBメモリはダメ等)。放射線治療PCにpython環境を作ればいいんですけど、Windows7にはVersion3.8しか入らないのでpylinacが走りません。とりあえず必要があればデータを取り出し、解析用PCで解析を行って、Linacの更新のタイミングでpython環境を入れさせてもらおうかなと思っている次第です。

Pythonでスクリプトを書くという作業は「めんどくせー」と思うのですが、10行程度なので慣れれば大丈夫になりました。時間が取れたら、Starshot、Picket Fence、Field Analysisもやってみたいと思っています。

Pylinacは進化しているので、ちょくちょくGithubを覗いてみようかと思っています。

May 17, 2023

この記事が気に入ったらサポートをしてみませんか?