tag:crieit.net,2005:https://crieit.net/tags/%E4%BD%BF%E3%81%84%E6%96%B9/feed 「使い方」の記事 - Crieit Crieitでタグ「使い方」に投稿された最近の記事 2021-09-17T18:37:29+09:00 https://crieit.net/tags/%E4%BD%BF%E3%81%84%E6%96%B9/feed tag:crieit.net,2005:PublicArticle/17679 2021-09-17T18:37:29+09:00 2021-09-17T18:37:29+09:00 https://crieit.net/posts/akapost-dcmtk DICOM Toolkit(dcmtk) 使い方 <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p>DICOM Toolkit(dcmtk)の使い方を毎回調べるのが馬鹿らしいのでまとめる。</p> <p>日本語で教えてくれる優しいところがないので、とりあえず動かすを第一目標に調べた結果を残す。<br /> 基本的なオプションのみまとめる。もっと知りたければ頑張ってマニュアル読む。</p> <p>DICOM的なワードもそのうちまとめる。</p> <h1 id="Storage SCP(受信)"><a href="#Storage+SCP%28%E5%8F%97%E4%BF%A1%29">Storage SCP(受信)</a></h1> <p>storescp.exe -v -aet [AEタイトル] [port]</p> <ul> <li>-v:詳細を出すだけなのでなくてもいい。</li> <li>-aet:自身(SCP)のAEタイトル。後に続くportも自身(SCP)のもの。</li> </ul> <hr /> <p>例:AEタイトル=TESTSVR、ポート=4006でDICOM受信したい場合<br /> storescp.exe -v -aet TESTSVR 4006</p> <hr /> <p>実行後は受付待ちに入るので、他の操作がしたいなら別窓開いて作業する。</p> <h1 id="Storage SCU(送信)"><a href="#Storage+SCU%28%E9%80%81%E4%BF%A1%29">Storage SCU(送信)</a></h1> <p>storescu.exe -v -aet [送り元AEタイトル] -aec [送り先AEタイトル] [hostname] [port] [DICOM File]</p> <ul> <li>-v:詳細を出すだけなのでなくてもいい。</li> <li>-aet:自身(SCU)のAEタイトル。</li> <li>-aec:相手(SCP)のAEタイトル。後に続くhostname,portも相手(SCP)のもの。</li> <li>[DICOM File]:転送したいDICOMファイル。相対パス可。ワイルドカード(*)可。</li> </ul> <hr /> <p>例:自身のAEタイトル=TESTSVR1から<br />   相手のAEタイトル=TESTSVR2(ホスト名=SCPSVR、ポート=4006)に<br />   カレント下のdataフォルダの拡張子.dcmのファイルのみDICOM送信したい場合<br /> storescu.exe -v -aet TESTSVR1 -aec TESTSVR2 SCPSVR 4006 .\data*.dcm</p> <hr /> <h1 id="Modality Worklist(MWM) SCP"><a href="#Modality+Worklist%28MWM%29+SCP">Modality Worklist(MWM) SCP</a></h1> <p>あらかじめWorklistファイル(.wl)を作っておく必要がある。<br /> 毎回データ作るの大変なのでpowersehllで自動生成するスクリプトを書いたが公開するには恥ずかしいレベルなので割愛。</p> <h2 id="1. データのもとになる.dumpファイルを作る"><a href="#1.+%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%82%82%E3%81%A8%E3%81%AB%E3%81%AA%E3%82%8B.dump%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8B">1. データのもとになる.dumpファイルを作る</a></h2> <p>[dcmtk置いたパス]\share\dcmtk\wlistdb\OFFISにサンプルがあるのでそれを参考に作る<br /> ※1ファイル1件</p> <pre><code>(0008,0050) SH 00000 (0040,0100) SQ (fffe,e000) - (0008,0060) CS MR (0032,1070) LO BARIUMSULFAT (fffe,e00d) - (fffe,e0dd) - </code></pre> <p>注意:上記は説明用にだいぶ端折ってるので、必須タグとかは自分で書くこと。</p> <p>基本は(gggg,eeee) [VR] [Value]の順に一行一タグで書いていく。<br /> SQタグは構造示すタグが挟まるので、上記のようにVRはハイフン、値は無しで書く。</p> <p>軽く触れておくと<br /> * (fffe,e000) : SQItem開始<br /> * (fffe,e00d) : SQItemデリミタ(SQItemがLength不明の場合)<br /> * (fffe,e0dd) : SQデリミタ(SQ全体がLength不明の場合)<br /> 詳細はPS3.5あたりに書いてあるのでそちらを参照のこと。</p> <h2 id="2.dumpファイルからWorklistファイルを作る"><a href="#2.dump%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89Worklist%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8B">2.dumpファイルからWorklistファイルを作る</a></h2> <p>dump2dcm [1で作ったdumpファイルのパス] [出力先のパス]</p> <hr /> <p>例:カレント下のdataフォルダのwklist1.dumpを同じフォルダのwklist1.wlにDICOM変換したい場合<br /> dump2dcm.exe .\data\wklist1.dump .\data\wklist1.wl</p> <hr /> <p>複数作るだろうからスクリプト書いてぐるぐる回すといい<br /> 確か勝手に同名ファイルは作ってくれなかったはず。</p> <h2 id="3.WorklistファイルをC-FINDを受けるAEタイトル名と同名フォルダに入れる(フォルダ名注意)"><a href="#3.Worklist%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92C-FIND%E3%82%92%E5%8F%97%E3%81%91%E3%82%8BAE%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB%E5%90%8D%E3%81%A8%E5%90%8C%E5%90%8D%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AB%E5%85%A5%E3%82%8C%E3%82%8B%28%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E5%90%8D%E6%B3%A8%E6%84%8F%29">3.WorklistファイルをC-FINDを受けるAEタイトル名と同名フォルダに入れる(フォルダ名注意)</a></h2> <p>SCUからC-FINDかけてくるAEタイトルのフォルダを作って、その中に入れておく必要あり。<br /> 次の手順と合わせてよく忘れるので注意。<br /> また、"lockfile"もAEタイトルフォルダの中に作っておく(wlmcspfs流すときに必要)</p> <hr /> <p>例:問い合わせを受けるAEタイトル=MWMTEST、カレント下のdataフォルダにWorklistファイル(wklist1.wl)を置く場合<br /> .\data\MWMTEST\wklist1.wl<br /> .\data\MWMTEST\lockfile</p> <hr /> <h2 id="4.MWM受付待ち状態にする(パス指定注意)"><a href="#4.MWM%E5%8F%97%E4%BB%98%E5%BE%85%E3%81%A1%E7%8A%B6%E6%85%8B%E3%81%AB%E3%81%99%E3%82%8B%28%E3%83%91%E3%82%B9%E6%8C%87%E5%AE%9A%E6%B3%A8%E6%84%8F%29">4.MWM受付待ち状態にする(パス指定注意)</a></h2> <p>wlmscpfs.exe -v -csk -dfp [3のAETITLEフォルダの親のパス] [port]</p> <ul> <li>-v ; 詳細表示</li> <li>-csk : キャラクタセット(文字セット)を維持。指定もできるけど基本的には維持で取っておけばあんまり困らない。</li> <li>-dfp : データファイルパス。AEタイトルフォルダの一個上を指定。このパスの下にあるAEタイトルを探すことになるらしい。一番はまったところ。注意。</li> </ul> <hr /> <p>例:カレント下のdataフォルダにAEタイトルフォルダ作ってWorklistファイル(wklist1.wl)を置いた場合<br /> wlmscpfs.exe -v -csk -dfp .\data 4006</p> <hr /> <p>実行後は受付待ちに入るので、他の操作がしたいなら別窓開いて作業する。</p> <h2 id="番外:日本語の取り扱い"><a href="#%E7%95%AA%E5%A4%96%EF%BC%9A%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E5%8F%96%E3%82%8A%E6%89%B1%E3%81%84">番外:日本語の取り扱い</a></h2> <p>Specific Character Set(0008,0005)に"\ISO 2022 IR87"セットして、<br /> バイナリエディタ使って、日本語の前後にエスケープ(iB 24 42 日本語 1B 28 42)入れて、<br /> Lengthも合わせてみたけどうまくいかなかった。<br /> 一時調査中断中。</p> <p>一方でUTF-8でならうまくいったので、こだわりがなければこっちで。<br /> 1.Specific Character Set(0008,0005)に"ISO IR192"セット<br /> 2.dumpに日本語を入力してUTF-8で保存<br /> 3.メモ帳編集の場合BOMが入ったので先頭3バイト削除<br /> 4.dump2dcmでwlファイル作る</p> <h1 id="Query/Retreive(Q/R) SCP"><a href="#Query%2FRetreive%28Q%2FR%29+SCP">Query/Retreive(Q/R) SCP</a></h1> <h2 id="1.DICOMファイルのIndex作成"><a href="#1.DICOM%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AEIndex%E4%BD%9C%E6%88%90">1.DICOMファイルのIndex作成</a></h2> <p>Q/RさせるDICOMファイル群のIndexファイルを作る(これを使ってQueryを返すらしい。)</p> <p>dcmqridx.exe -v [index出力先フォルダ] [対象のDICOMファイル]</p> <hr /> <p>例:カレント下のdataフォルダにDICOMファイルがあり、同じフォルダにIndexファイルを吐き出す場合<br /> dcmqridx.exe -v .\data .\data*.dcm</p> <hr /> <h2 id="2.設定ファイルを作る"><a href="#2.%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8B">2.設定ファイルを作る</a></h2> <p>[dcmtk置いたパス]\etc\dcmtk\dcmqrscp.cfgにサンプルがあるのでコピーして使う</p> <h3 id="2-1.Q/R SCU(問い合わせ元)の情報を設定する"><a href="#2-1.Q%2FR+SCU%28%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E5%85%83%29%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B">2-1.Q/R SCU(問い合わせ元)の情報を設定する</a></h3> <p>Host TableのBEGINからENDの間に<br /> [設定名] = ([AEタイトル], [HostName], [Port])<br /> の形で書く。</p> <hr /> <p>例:AEタイトル=TESTSVR1、HostName=SCUTEST、Port=4006をqrtestの名前で設定する場合<br /> HostTable BEGIN<br /> qrtest = (TESTSVR1, SCUTEST, 4006)<br /> HostTable END</p> <hr /> <p>なお、複数の設定を一個の設定にまとめたりもできるとのこと<br /> [設定名1] = ([AEタイトル], [HostName], [Port])<br /> [設定名2] = ([AEタイトル], [HostName], [Port])<br /> [設定名ALL] = [設定名1], [設定名2]</p> <hr /> <p>例:AEタイトル=TESTSVR1、HostName=SCUTEST1、Port=4006をqrtest1、<br />   AEタイトル=TESTSVR2、HostName=SCUTEST2、Port=4006をqrtest2、<br />   上記二つをqrtestallまとめる場合<br /> HostTable BEGIN<br /> qrtest1 = (TESTSVR1, SCUTEST1, 4006)<br /> qrtest2 = (TESTSVR2, SCUTEST2, 4006)<br /> qrtestall = qrtest1, qrtest2<br /> HostTable END</p> <hr /> <h3 id="2-2.Q/R SCP(問い合わせ先)の情報を設定する"><a href="#2-2.Q%2FR+SCP%28%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E5%85%88%29%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B">2-2.Q/R SCP(問い合わせ先)の情報を設定する</a></h3> <p>AE TableのBEGINからENDの間に<br /> [AEタイトル] [Q/RさせるDICOMファイル置き場] [Read/Write] [(最大検査数, 最大検査Byte)] [対応するHostTable設定名]<br /> の形で書く。</p> <p>DICOMファイル置き場はここで相対書くとどこからになるか不明。試したことはない。<br /> やってみたくなったら試して結果を追記する。</p> <p>Read/WriteはQRで書いてどうするんだろうと思うけどわからないときはRW<br /> 最大検査数、バイトに関してはある程度で絞っておかないと用意した検査数によっては泣きたくなるので適宜。</p> <hr /> <p>例:AEタイトル=QRSCPAE、ファイル置き場=H:DICOM¥QRSCP¥QRTEST、最大検査を200件、1024MBとし、qrtest1に設定した相手のみ有効とする場合<br /> AETable BEGIN<br /> QRSCPAE H:DICOM¥QRSCP¥QRTEST RW (200,1024mb) qrtest1<br /> AETable END</p> <hr /> <h2 id="3.Query待ち状態にする"><a href="#3.Query%E5%BE%85%E3%81%A1%E7%8A%B6%E6%85%8B%E3%81%AB%E3%81%99%E3%82%8B">3.Query待ち状態にする</a></h2> <p>dcmqrscp -v -c [設定ファイルのパス] [Port]<br /> * -v : 詳細表示<br /> * -c : 設定ファイルのパス指定</p> <hr /> <p>例:カレント下のetcに2の設定ファイルがあり、Port=4006で受け付ける場合<br /> dcmqrscp -v -c .\etc\dcmqrscp.cfg 4006</p> <hr /> <p>実行後は受付待ちに入るので、他の操作がしたいなら別窓開いて作業する。</p> <h1 id="Modality Performed Procedure Step(MPPS)"><a href="#Modality+Performed+Procedure+Step%28MPPS%29">Modality Performed Procedure Step(MPPS)</a></h1> <p>ppsscpfsなるものがあるらしいが、見当たらない。<br /> 誰か教えてほしい。</p> RedCol