DICOM モダリティ・ワークリスト・プロダクションのサンプル
一般的な DICOM SOP クラスの 1 つに、モダリティ・ワークリスト (MWL) があります。MWL により、主要な画像機器 (モダリティ) は、通常は放射線科情報システム (RIS) の一部である MWL サービス・クラス・プロバイダ (SCP) に患者基本情報や検査の詳細を照会できます。モダリティが標準的な C-FIND オペレーションを介し、選択された条件を使用して患者のリストを要求すると、それに応じてモダリティ・ワークリスト・サービスが応答します。
このサンプル・プロダクションは Demo.DICOM.Production.WorkList という名前で、DICOM ワークリストをサポートするモダリティにおいて、プロダクションを使用してワークリストを処理する方法を示します。
このプロダクションのシナリオは、モダリティが 1 日の初めに、処理する作業のリストを必要とするというものです。プロダクションでは次の処理が行われます。
-
モダリティは C-FIND 要求メッセージをプロダクションに送信します。
-
C-FIND 要求は、ワークリストが必要であることを示します。
-
プロダクションは情報を検索します。
-
プロダクションはリスト内の患者ごとに C-FIND 応答メッセージを作成します。
-
プロダクションは応答メッセージをモダリティに返します。
ビジネス・サービス EnsLib.DICOM.Service.TCPOpens in a new tab は、DICOM 画像デバイスに接続します。Demo.DICOM.Process.WorkList ビジネス・プロセス・クラスは、DICOM C-FIND-RQ メッセージを処理してワークリスト・エントリで応答する方法を示します。
この方法でのみ、モダリティ・ワークリスト SOP クラス (MWL) は動作します。つまり、モダリティからサービス・プロバイダ (SCP) にデータを照会します。SCP からモダリティ機器にデータをブロードキャストする手段はありません。同様に、MWL プロトコル自体には、返された一致リストからどの患者が選択されたかをモダリティが RIS に通知する手段がありません。ただし、モダリティ実施済み手続きステップ (MPPS) サービスが両方の機器でサポートされている場合は、このサービスを使用してそうした情報を通信することが可能です。
このタイプのインタフェースをプロダクションに追加する手順の概要を次に示します。
-
[プロダクション構成] ページで [新規プロダクション作成] をクリックして、汎用プロダクションを作成します。"プロダクションの構成" の “プロダクションの作成と構成” を参照してください。
-
スタジオで、プロダクション定義を変更して StorageLocation プロパティと SETTINGS パラメータの両方を追加します。StorageLocation と SETTING の定義の詳細は、"ストレージ場所を制御するための DICOM プロダクションの構成" を参照してください。StorageLocation が正しく機能するためには、SETTINGS パラメータが必要です。StorageLocation と SETTINGS を定義したら、プロダクションをコンパイルします。
-
EnsLib.DICOM.Service.TCPOpens in a new tab クラスを使用して、プロダクションに DICOM 二重ビジネス・サービスを追加します。
-
DICOM ビジネス・サービスを構成して、特にモダリティ・ワークリストに必要な設定を指定します。
-
受信 DICOM C-FIND-RQ メッセージ・ドキュメントからワークリスト・エントリを生成するビジネス・プロセス・クラスを作成します。
-
前の手順で作成したカスタム・クラスを使用して、DICOM ビジネス・プロセスを追加します。
-
プロダクションをテストして、ワークリストの要求メッセージを受け取り適切な応答メッセージ・ドキュメントを返すことを確認します。
スタジオを使用して Demo.DICOM.Production.WorkList.cls のクラス・コードを表示することで、プロダクションの詳細を確認できます。
DICOM ワークリスト・プロダクションのビジネス・プロセス・クラスの作成
Demo.DICOM.Production.WorkList プロダクションは、サンプルのカスタム・ビジネス・プロセス・クラス Demo.DICOM.Process.WorkList を使用します。このカスタム・クラスは、DICOM C-FIND 要求メッセージを処理してワークリスト・エントリで応答する方法を示します。このデモ・クラスは、RIS システムから患者情報を取得する処理をシミュレートします。
このカスタム・クラスは、すべてのユーザ定義 DICOM ビジネス・プロセスのスーパークラスである EnsLib.DICOM.ProcessOpens in a new tab を拡張します。詳細は、"クラス・リファレンス" でそのエントリを参照してください。
手順については、"プロダクションの開発" の "カスタム・ビジネス・プロセスの定義" を参照してください。
Demo.DICOM.Process.WorkList クラスは、SETTINGS パラメータを使用して、新しい NumberOfWorkListEntries プロパティを構成対象として公開します。この設定は、C-FIND 要求の結果として返されるワークリスト・エントリの数に影響します。
カスタム・クラスの内容の概要については、次の各節を参照してください。
スタジオを使用して Demo.DICOM.Process.WorkList.cls のクラス・コードを表示することで、処理の詳細を確認できます。
DICOM 通信の二重性により、ビジネス・プロセスは、プロセス外で何が行われているかを追跡する必要があります。これを実現するには、プロセスの状態のコンテキスト変数を使用します。
DICOM ワークリスト・プロセスのプロパティ
カスタム・クラスは、要求を読み取って応答の形式を設定するために必要となる次のプロパティを追加します。
NumberOfWorkListEntries
ワークリスト・エントリの数。構成可能です。デフォルトは 1 です。
ReplyCounter
ワークリスト要求に対して送信された応答の数を追跡します。
DICOM ワークリスト・プロセスのメソッド
カスタム・クラスは、要求を処理して応答を作成するために必要となる次のメソッドを追加します。
OnMessage()
このメソッドは、C-FIND 要求メッセージと C-CANCEL 要求メッセージを処理します。検索要求は、要求のデータセットで指定されている条件を使用してクエリを実行するよう求めます。クエリにはかなり時間がかかり多数の結果が生成される可能性があるため、個々の一致は 1 つまたは複数のメッセージで報告されます。このデモ・メソッドは、他のタイプの DICOM メッセージを想定していません。
OnMessage() メソッドには、以下のシグニチャがあります。
Method OnMessage(pSourceConfigName As %String,
pInput As %Library.Persistent)
As %Status
OnError()
このメソッドは、エラーが発生すると呼び出されます。同じエラーが返されると、ビジネス・プロセスはステータスをエラーに設定し、終了します。
OnError() メソッドには、以下のシグニチャがあります。
Method OnError(request As %Library.Persistent, ByRef response As %Library.Persistent,
callrequest As %Library.Persistent,
pErrorStatus As %Status,
pCompletionKey As %String)
As %Status
CreateIntermediateFindResponse()
このメソッドは、C-FIND 応答のメッセージの中間インスタンスを生成し、必須の DICOM フィールドに入力します。プロトコルでは、最後のメッセージ以外のすべてのメッセージのステータスが保留中に設定されるよう規定されています。これにより、クライアントは、受信するデータがさらにあることがわかります。最後のメッセージのステータスは成功に設定され、クエリが終了したことを意味します。この例では、選択条件が無視され、ダミーの患者レコードが返されます。当然ながら、プロダクションの実装はこれよりも複雑になります。
CreateIntermediateFindResponse() メソッドには、以下のシグニチャがあります。
Method CreateIntermediateFindResponse(pDocIn As EnsLib.DICOM.Document,
Output pDocOut As EnsLib.DICOM.Document)
As %Status
CreateFinalFindResponse()
このメソッドは、最後のプロセスが完了したことを示すメッセージのインスタンスを生成し、コマンド・フィールドを C-FIND-RSP に設定して検索応答メッセージであることを示します。
CreateFinalFindResponse() メソッドには、以下のシグニチャがあります。
Method CreateFinalFindResponse(pDocIn As EnsLib.DICOM.Document,
Output pDocOut As EnsLib.DICOM.Document)
As %Status
DICOM ワークリスト・プロダクションのテスト
実際に使用できるように関連付けを定義し、プロダクションを作成したら、ワークリスト・プロダクションを使用して有効な DICOM メッセージ・ドキュメントの処理を試してみることができます。DICOM デモ・プロダクションは、DICOM 処理のテストを目的として特別に開発されたサードパーティ・ソフトウェアを使用して開発されました。提供されているさまざまなソフトウェア製品を使用することも、実際の DICOM モダリティ・データを使用してテストすることもできます。
ここでは、管理ポータルの [イベント・ログ] ページ、[メッセージ・ブラウザ] ページ、[メッセージ詳細] ページ、および [メッセージ・コンテンツ] ページの一部を示します。これらのページは、ワークリストをサポートするモダリティから DICOM メッセージを受け取る実行中の Demo.DICOM.Production.WorkList プロダクションのものです。
メッセージ・ブラウザに表示された DICOM メッセージ・ドキュメントを次に示します。
コマンド・セットにメタデータが含まれデータ・セットに物理データが含まれている DICOM メッセージの構造を確認できます。
次に示す [イベント・ログ] ページの一部には、モダリティと通信し、ビジネス・プロセスで構成された 3 つのワークリスト項目を処理するプロダクションを実行したときのイベントが (最初から) 表示されています。
次のログは、サードパーティの DICOM テスト・ソフトウェアのもので、プロダクションとの通信を示しています。
test: #3:ENS-SCP << A-ASSOCIATE-RQ PDU
test: #3:ENS-SCP >> A-ASSOCIATE-AC PDU
test: #3:ENS-SCP << C-FIND-RQ Modality Worklist Information Model - FIND SOP Class
test: #3:ENS-SCP << Dataset
test: #3:ENS-SCP >> C-FIND-RSP Modality Worklist Information Model-FIND SOP Class, status #ff01H[StatusEntry.PENDING]
test: #3:ENS-SCP >> Dataset
test: #3:ENS-SCP >> C-FIND-RSP Modality Worklist Information Model-FIND SOP Class, status #ff01H[StatusEntry.PENDING]
test: #3:ENS-SCP >> Dataset
test: #3:ENS-SCP >> C-FIND-RSP Modality Worklist Information Model-FIND SOP Class, status #ff01H[StatusEntry.PENDING]
test: #3:ENS-SCP >> Dataset
test: #3:ENS-SCP >> C-FIND-RSP Modality Worklist Information Model-FIND SOP Class, status #0000H[Success]
test: #3:ENS-SCP << A-RELEASE-RQ PDU
test: #3:ENS-SCP >> A-RELEASE-RP PDU
test: #3:ENS-SCP closing socket