過去のPhilipsのfMRIデータをdcm2niixで変換しようとした時に4次元データにならない問題の解決法

ある施設の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> = &#039;20231004&#039;

<strong>desc</strong> = &#039;&#039;&#039;
Remove Trigger Time (0018,1060) from Philips rsfMRI
&#039;&#039;&#039;
<strong>epilog</strong> = &#039;&#039;&#039;
examples:
  dcm_rm_trigger_time.py DICOM_DIR1 DICOM_DIR2 ...
&#039;&#039;&#039;

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(&#039;/&#039;,&#039;&#039;)
                del ds[0x0018, 0x1060]
                ds.save_as(src_file)
            except:
                pass

if <strong>name</strong> == &#039;<strong>main</strong>&#039;:
    start_time = time.time()
    parser = argparse.ArgumentParser(description=<strong>desc</strong>, epilog=<strong>epilog</strong>,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument(&#039;dirs&#039;, metavar=&#039;DICOM_DIR&#039;, help=&#039;DICOM directories.&#039;, nargs=&#039;+&#039;)

<pre><code>err = 0
try:
    args = parser.parse_args()
    for dicom_dir in args.dirs:  # Loop through all the provided directories
        print(f&amp;#039;remove dicom tag (0018,1060) from {dicom_dir}&amp;#039;)
        remove_triggertime(dicom_dir)
    print(&amp;quot;execution time: %.2f second.&amp;quot; % (time.time() - start_time))
except Exception as e:
    print(&amp;quot;%s: error: %s&amp;quot; % (__file__, str(e)))
    err = 1

sys.exit(err)
</code></pre>

これは、

dcm_rm_triggertime.py DICOMフォルダ

とすることで、そのフォルダ内のtrigger timeタグを削除します。

この処理をした後のDICOMを使って dcm2niix を行ったところ、問題なく変換されました。

困っている人がいると思うので共有しておきます。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください