python による dicom サーバー — 独自に作成

linux mint の端末の flask から ubuntu 上にある mysql にアクセスして必要な情報を取得して、その情報により NAS 内にある dicom ファイルを ftp ダウンロードして weasis を起動して dicom ファイルを閲覧します。

以前は、dcm4chee のディレクトリ構造を解析して、処理すべき dicom ファイルのタグ情報を読み込んで、dcm4chee と同じようなディレクトリ構造を作成していましたが、今度は dcm4chee とは無関係にディレクトリ構造を構築します。

とは言っても、dcm4chee とちょっと似ている構造にします。

これまでは以下のように、年/月/日でディレクトリを作成しその中にカルテ番号さらに検査IDディレクトリを作成していました。


pDICOM
└── 2021
    └── 11
        └── 12
            ├── 20100761
            │   └── 9473
            │       ├── 9473_00000.dcm
            │       ├── 9473_00001.dcm
            │       ├── 9473_00002.dcm
            │       ├── 9473_00003.dcm
            │       ├── 9473_00004.dcm
            │       ├── 9473_00005.dcm
            │       ├── 9473_00006.dcm
            │       ├── 9473_00007.dcm
            │       ├── 9473_00008.dcm
            │       └── 9473_00009.dcm
            ├── 21202817
            │   └── 999
            │       ├── 999_00000.dcm
            │       ├── 999_00001.dcm
            │       ├── 999_00002.dcm
            │       ├── 999_00003.dcm
            │       ├── 999_00004.dcm
            │       ├── 999_00005.dcm
            │       └── 999_00006.dcm
            └── 9501731
                └── 976
                    ├── 976_00000.dcm
                    ├── 976_00001.dcm
                    ├── 976_00002.dcm
                    ├── 976_00003.dcm
                    ├── 976_00004.dcm
                    ├── 976_00005.dcm
                    ├── 976_00006.dcm
                    ├── 976_00007.dcm
                    ├── 976_00008.dcm
                    ├── 976_00009.dcm
                    └── 976_00010.dcm

最初の「年/月/日」は dcm4chee のものをそのまま持ってきていました。
これは検査日ではなくて、dicom ファイルを処理した日付です。
これはこれでいいと思っていました。

しかし、よく考えたら、やはり「年/月/日」は検査施行日の方がいいと思います。
そうすれば、同じ dicom ファイルを python で処理すると同じディレクトリ構造になるはず。

検査施行日のディレクトリを作成する

dicom ファイルのタグ情報には studyDate という項目があり、例えば「20211209」というような文字列になっています。
この文字列を日付に変換して、「年/月/日」を抽出しディレクトリを作成します。


    @classmethod 
    def getBdir(self, studyDate ):
        dte = datetime.datetime.strptime( studyDate, '%Y%m%d')
        fpath = dte.strftime('%Y/%m/%d')       
        return fpath

    def copyDicomFile( self, dicomArr ):
        dicomFileDir = self.localpydcm
        for eachFile in dicomArr:
            ds = pydicom.read_file(eachFile)
            studyID = ds[0x0020, 0x0010].value
            studyDate = ds[0x0008, 0x0020].value
            karteNo = ds[0x0010, 0x0020].value
            firstDir = Dicom.getBdir( studyDate )
            destinationDir = self.localpydcm + firstDir + '/' + karteNo + '/' + studyID
            os.makedirs(destinationDir, exist_ok=True)
            dicomCount = self.countDicom(destinationDir)
            newFileName = studyID + "_%05d.dcm" %(dicomCount)
            destination = destinationDir + '/' + newFileName
            shutil.copyfile(eachFile, destination)

このようにすれば、検査日によるディレクトリ構造が出来上がるため、やはりバックアップがとても簡単になります。