ある施設の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
<h1>-<em>- coding: utf-8 -</em>-</h1>
<h1>Script to remove trigger time from Philips fMRI</h1>
<h1>source: https://github.com/rordenlab/dcm2niix/issues/428</h1>
<h1>14 Oct 2023 K. Nemoto</h1>
import sys, os, time, argparse
import pydicom
<strong>version</strong> = '20231004'
<strong>desc</strong> = '''
Remove Trigger Time (0018,1060) from Philips rsfMRI
'''
<strong>epilog</strong> = '''
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 <strong>name</strong> == '<strong>main</strong>':
start_time = time.time()
parser = argparse.ArgumentParser(description=<strong>desc</strong>, epilog=<strong>epilog</strong>,
formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('dirs', metavar='DICOM_DIR', help='DICOM directories.', nargs='+')
<pre><code>err = 0
try:
args = parser.parse_args()
for dicom_dir in args.dirs: # Loop through all the provided directories
print(f&#039;remove dicom tag (0018,1060) from {dicom_dir}&#039;)
remove_triggertime(dicom_dir)
print(&quot;execution time: %.2f second.&quot; % (time.time() - start_time))
except Exception as e:
print(&quot;%s: error: %s&quot; % (__file__, str(e)))
err = 1
sys.exit(err)
</code></pre>
これは、
dcm_rm_triggertime.py DICOMフォルダ
とすることで、そのフォルダ内のtrigger timeタグを削除します。
この処理をした後のDICOMを使って dcm2niix を行ったところ、問題なく変換されました。
困っている人がいると思うので共有しておきます。