ある施設のrs-fMRIのDICOMデータをNiftiに変換しようとした時に、以下のようになってしまい、4次元データができませんでした。
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が入っていれば動くはずです。
こちらから手に入れられます。
#!/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)
これは、
dcm_rm_triggertime.py DICOMフォルダ
とすることで、そのフォルダ内のtrigger timeタグを削除します。
この処理をした後のDICOMを使って dcm2niix を行ったところ、問題なく変換されました。
困っている人がいると思うので共有しておきます。