Skip to content

Wrong TimeZero in certain cases #983

@ChristianHinge

Description

@ChristianHinge

Hi Chris - thanks for this awesome tool!

issue modified from this issue at PET2BIDS

Describe the bug
dcm2niix uses AcquisitionTime in cases where SeriesTime should be used. I believe this is a bug, or perhaps this is just unique to Siemens Scanners. In Siemens PET scanners SeriesTime describes the start time of the PET acquisition - not AcquisitionTime. AcquisitionTime describes the timepoint in the acquisition, where data was used to reconstruct the DICOM-file. So if we do a 20minute PET acquisition, but reconstruct the image based only on the last 15 minutes, then the AcqusionTime will be 5 minutes bigger than SeriesTime. Also note that DecayCorrection is performed by Siemens to SeriesTime. Often AcquisitionTime==SeriesTime, but not in the following cases:

  1. Dynamic acquisition: the AcquisitionTime changes for each time frame.
  2. Multiple bed positions: the AcquisitionTime changes for each bed frame.
  3. Static images reconstructed from a time-subset of a longer acquisition: For instance, a static reconstruction based on a 50-70min window of a 70minute PET acquisition. Here AcquistionTime will be 50min larger than SeriesTime.

Here is the example output for case 3 (FDG tracer injection and PET acquisition start at 16:20, and a static image is reconstructed from the 50-70min window):

{
    "SeriesTime": "16:20:16.000000",
    "AcquisitionTime": "17:10:15.000000",
    "DecayCorrection": "START",
    "DecayFactor": [
        1.45951
    ],
    "FrameTimesStart": [
        0 ##Should be 3000 (50min*60)
    ],
    "FrameDuration": [
        1200
    ],
    "TimeZero": "17:10:15", ## Should be 16:20:16
    "DecayCorrectionFactor": [
        1.45951
    ],
    "ScanStart": 0,
    "InjectionStart": 0
}

We can also see from the DecayCorrectionFactor, that everything is decayed back to the SeriesTime.
log2(1.45951)*110=60min (the frame reference 50min + 20min/2)

Expected behaviour
FrameTimesStart should be 3000. From what I can see, pypet2bids extracts FrameTimesStart and TimeZero from the dcm2niix sidecar if they exists. Otherwise it sets it equal to AcquisitionTime.

To Reproduce
I used pypet2bids, to perform the conversion, but this grabs the values directly from dcm2niix sidecar. I reproduced with dcm2niix as well.

Version

Chris Rorden's dcm2niiX version v1.0.20241211 (JP2:OpenJPEG) (JP-LS:CharLS) GCC8.4.0 x86-64 (64-bit Linux)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions