DICOM-RT形式を読み込む – プラン編【Python】

放射線治療におけるプランデータを格納するDICOM-RTデータの扱い方を説明します。

サンプルデータの準備

Pydicomには放射線治療で使われるDICOM-RTのサンプルも含まれています。プランデータのサンプルは’rtplan.dcm’です。

import pydicom
path = pydicom.data.get_testdata_file('rtplan.dcm')
dataset = pydicom.filereader.dcmread(path)

ここでは、この’rtplan.dcm’を例にDICOM-RTのプランデータの扱い方を見ていきます。

なお、DICOM形式のデータ構造については以下の記事を参照してください。

処方線量

リファレンスポイントの指定

プランに作成したリファレンスポイントは(keyword) DoseReferenceSequenceで取得できます。SequenceオブジェクトでそれぞれのリファレンスポイントがDatasetオブジェクトとしてリスト形式で格納されています。

リファレンスポイントの座標は次のように取得できます。

import pydicom
path = pydicom.data.get_testdata_file('rtplan.dcm')
dataset = pydicom.filereader.dcmread(path)
print(dataset.DoseReferenceSequence[0].DoseReferencePointCoordinates)
[239.531250000000, 239.531250000000, -741.87000000000]

線量 / 分割の指定

プランの処方線量は(keyword) FractionGroupSequenceで取得できます。Sequenceオブジェクトですが、プランの最初から最後まで処方が変わらない場合はアイテムは1つだけです。

分割回数は以下で取得できます。

import pydicom
path = pydicom.data.get_testdata_file('rtplan.dcm')
dataset = pydicom.filereader.dcmread(path)
print(dataset.FractionGroupSequence[0].NumberOfFractionsPlanned)
30

ReferencedBeamSequenceで各ビームごとの実際に用いられたリファレンスポイントと1回線量が指定されています。

import pydicom
path = pydicom.data.get_testdata_file('rtplan.dcm')
dataset = pydicom.filereader.dcmread(path)
print(dataset.FractionGroupSequence[0].ReferencedBeamSequence[0])
(300a, 0082) Beam Dose Specification Point       DS: [239.531250000000, 239.531250000000, -751.87000000000]
(300a, 0084) Beam Dose                           DS: "1.0275401"
(300a, 0086) Beam Meterset                       DS: "116.0036697"
(300c, 0006) Referenced Beam Number              IS: "1"

Beam Dose Specification Pointが実際の用いられたリファレンスポイントの座標で、Beam Doseがこのビームの1回線量です。(サンプルプランではあまり見かけない線量になっていますが…)

例えば2門照射であれば、各々のビームのBeam Doseの合計がそのプランの1回線量となります。

ビーム情報

プランのビーム情報は(keyword) BeamSequenceで取得できます。BeamSequenceは複数のビームを配置できるようにSequenceオブジェクトとなっていて、各々のビームを表すDatasetオブジェクトがリスト形式で格納されています。
このサンプルファイルではビームは1つしか設定されていないので、そのビームを取得します。

import pydicom
path = pydicom.data.get_testdata_file('rtplan.dcm')
dataset = pydicom.filereader.dcmread(path)
beam = dataset.BeamSequence[0]

ここで取得したビームはDatasetオブジェクトなので、そこにはどのような項目の情報があるのかを確認してみます。

print(beam.dir())
['BeamLimitingDeviceSequence', 'BeamName', 'BeamNumber', 'BeamType', 'ControlPointSequence', 'DeviceSerialNumber', 'FinalCumulativeMetersetWeight', 'InstitutionName', 'InstitutionalDepartmentName', 'Manufacturer', 'ManufacturerModelName', 'NumberOfBlocks', 'NumberOfBoli', 'NumberOfCompensators', 'NumberOfControlPoints', 'NumberOfWedges', 'PrimaryDosimeterUnit', 'RadiationType', 'ReferencedPatientSetupNumber', 'SourceAxisDistance', 'TreatmentDeliveryType', 'TreatmentMachineName']

ビームに含まれる各項目は以下の通りです。なお、ここに示したのはVarianのEclipseを用いた放射線治療計画を想定しているので、ほかのTPSを用いた場合や特殊な照射法では項目が変わってくると思われます。

keyword説明
BeamLimitingDeviceSequenceJaw / MLCに関する情報
X-Jaw / X-Jaw / MLCの3つが含まれる
BeamNameビーム名
BeamNumberビーム番号
BeamTypeビームの種類(STATIC / DYNAMICなど)
ControlPointSequenceビームのコントロールポイントごとの状態
ガントリー角度、コリメーター角度、カウチ角度、エネルギー、Dose Rate、Jaw / MLCのポジションなどが含まれる
DeviceSerialNumber治療装置のシリアルナンバー
FinalCumulativeMetersetWeight
InstitutionName病院名
InstitutionalDepartmentName病院の部署名
Manufacturer治療装置の製造元
ManufacturerModelName治療装置の型名
NumberOfBlocksブロックの数
NumberOfBoli
NumberOfCompensators
NumberOfControlPointsコントロールポイントの数
NumberOfWedgesウェッジの数
PrimaryDosimeterUnit照射量の単位(MUなど)
RadiationType放射線の種類
ReferencedPatientSetupNumber
SourceAxisDistanceSAD
TreatmentDeliveryType
TreatmentMachineName治療装置の名前

ガントリー角度やMLC位置などのビームの中心的な情報が、BeamSequenceの直下ではなくて、さらにControlPointSequenceの下にあるのが少しわかりにくいかもしれませんね。固定多門照射であっても、コントロールポイントが1つの回転照射と扱うことで汎用性を高めているようです。

これだけではなかなかイメージしづらいので、具体的な状況を想定してみましょう。

固定多門照射(4門)

BeamSequenceにそれぞれのビームを表すアイテムが一つずつ含まれ、合計で4つのアイテムが含まれます。
各ビームは固定して照射するので、各々のビームのControlPointSequenceには1つのアイテムが含まれて、そこでガントリー角度やMLCの形状などが指定されます。

なお、照合用のフィールドやCBCTなどでアイテム数が増えることはあります。

VMAT 2arc

BeamSequenceに各アークを表すアイテムが一つずつ含まれ、合計で2つのアイテムが含まれます。
各アークにおいては、例えばコントロールポイントを178個とると、ControlPointSequenceには178個のアイテムが含まれて、そこで各コントロールポイントにおけるガントリー角度やMLC形状などが指定されます。

なお、照合用のフィールドやCBCTなどでアイテム数が増えることはあります。

練習

では、最後にこのサンプルの放射線治療計画におけるJawの位置を取得してみましょう。このサンプルは前方1門照射なので、

import pydicom
path = pydicom.data.get_testdata_file('rtplan.dcm')
dataset = pydicom.filereader.dcmread(path)
beam = dataset.BeamSequence[0]    # ビームを取得
controlPoint = beam.ControlPointSequence[0]    # コントロールポイントを取得
print('X-Jaw')
print(controlPoint.BeamLimitingDevicePositionSequence[0])
print('Y-Jaw')
print(controlPoint.BeamLimitingDevicePositionSequence[1])
X-Jaw
(300a, 00b8) RT Beam Limiting Device Type        CS: 'X'
(300a, 011c) Leaf/Jaw Positions                  DS: [-100.00000000000, 100.000000000000]
Y-Jaw
(300a, 00b8) RT Beam Limiting Device Type        CS: 'Y'
(300a, 011c) Leaf/Jaw Positions                  DS: [-100.00000000000, 100.000000000000]

サンプルの治療計画にはMLCがありませんが、MLCが入っている場合はBeamLimitingDevicePositionSequence[2]がMLCになります。

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)