放射線治療におけるプランデータを格納するDICOM-RTデータの扱い方を説明します。
[toc]サンプルデータの準備
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 | 説明 |
---|---|
BeamLimitingDeviceSequence | Jaw / 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 | |
SourceAxisDistance | SAD |
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になります。
コメント