ある施設のrs-fMRIのDICOMデータをNiftiに変換しようとした時に、以下のようになってしまい、4次元データができませんでした。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | sub1_+rsfMRI_201.nii sub1_+rsfMRI_201_t10000.nii sub1_+rsfMRI_201_t100000.nii sub1_+rsfMRI_201_t102500.nii sub1_+rsfMRI_201_t105000.nii sub1_+rsfMRI_201_t107500.nii sub1_+rsfMRI_201_t110000.nii sub1_+rsfMRI_201_t112500.nii sub1_+rsfMRI_201_t115000.nii sub1_+rsfMRI_201_t117500.nii sub1_+rsfMRI_201_t120000.nii sub1_+rsfMRI_201_t122500.nii sub1_+rsfMRI_201_t12500.nii ... |
ポイントは、ファイル名の後ろに tの後に数字がつくことです。
この原因を探っていたところ、dcm2niixのGitHubページを見つけました。
https://github.com/rordenlab/dcm2niix/issues/428
ここで開発者のChris Rorden教授が以下のように述べています。
your files have a bogus value for cardiac trigger time (0018,1060). This is a limitation of your images, not dcm2niix. You should work with your Philips Research Collaboration manager to fix your scanner. For archival-quality data you could purge the invalid tags from your images, e.g. gdcmanon –dumb –remove 0018,1060 -i … -o …
Cardiac Trigger Timeというタグに値が入ってしまっていることで、dcm2niixはこれを別々のものと認識してひとつにしないようです。過去に撮像したデータの場合、0018,1060を削除するのは一手ではないかとおっしゃっています。実際に確認したところ、そのタグが入っていました。
そこで、このタグを削除する以下のようなPythonスクリプトを書いてみました。pydicomが入っていれば動くはずです。
こちらから手に入れられます。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Script to remove trigger time from Philips fMRI # source: https://github.com/rordenlab/dcm2niix/issues/428 # 14 Oct 2023 K. Nemoto import sys, os, time, argparse import pydicom __version__ = '20231004' __desc__ = ''' Remove Trigger Time (0018,1060) from Philips rsfMRI ''' __epilog__ = ''' examples: dcm_rm_trigger_time.py DICOM_DIR1 DICOM_DIR2 ... ''' def remove_triggertime(src_dir): # modify files for root, dirs, files in os.walk(src_dir): for file in files: try : src_file = os.path.join(root, file ) ds = pydicom.dcmread(src_file) pid = src_dir.replace( '/' ,'') del ds[ 0x0018 , 0x1060 ] ds.save_as(src_file) except : pass if __name__ = = '__main__' : start_time = time.time() parser = argparse.ArgumentParser(description = __desc__, epilog = __epilog__, formatter_class = argparse.RawDescriptionHelpFormatter) parser.add_argument( 'dirs' , metavar = 'DICOM_DIR' , help = 'DICOM directories.' , nargs = '+' ) err = 0 try : args = parser.parse_args() for dicom_dir in args.dirs: # Loop through all the provided directories print (f 'remove dicom tag (0018,1060) from {dicom_dir}' ) remove_triggertime(dicom_dir) print ( "execution time: %.2f second." % (time.time() - start_time)) except Exception as e: print ( "%s: error: %s" % (__file__, str (e))) err = 1 sys.exit(err) |
これは、
1 | dcm_rm_triggertime.py DICOMフォルダ |
とすることで、そのフォルダ内のtrigger timeタグを削除します。
この処理をした後のDICOMを使って dcm2niix を行ったところ、問題なく変換されました。
困っている人がいると思うので共有しておきます。