Page MenuHomePhabricator

DICOM loading crashes with C-Arm CT data
Closed, ResolvedPublic

Description

Assertion (gdcmAttribute.h:443)
"assert( GetTag() == de.GetTag() || GetTag().GetGroup() == 0x6000 || GetTag().GetGroup() == 0x5000 );"
fails with Siemens C-Arm CT images.

The last working release was 2013.03

Related Objects

StatusAssignedTask
ResolvedNone
ResolvedNone

Event Timeline

First we tested if the ITK and GDCM updates are the problem.
Downgrade to old GDCM version 2.0.18 did not solve the problem. Also tried newest GDCM version 2.4.0 without success.
The problem seems to be ITK related.

The z-spacing of our image data is stored at (0x0018,0x0050) "SliceThickness"

GDCM however expects the information at (0x0018,0x0088) "SpacingBetweenSlices" and fails to compensate missing information. For example, GDCM tries to use a "FrameIncrementPointer" at (0x0028,0x0009), which points to a non-existent tag "FrameTime" at (0x0028,0x1063).

If we force the method GetZSpacingTagFromMediaStorage to return our desired tag (0x0018,0x0050), everything works fine.

We have a fix for the gdcmImageHelper.cxx. We ignore the FrameIncrementPointer, if it points to a non-existent tag (0x0018,0x1063). This still results in warnings, but C-Arm CT images can be loaded again in MITK.

1232c1232

< if( at.GetValue() == Tag(0x0018,0x1063) && at.GetNumberOfValues() == 1 )

if( at.GetValue() == Tag(0x0018,0x1063) && at.GetNumberOfValues() == 1 && ds.FindDataElement(Tag(0x0018,0x1063)) )

GDCM was updated to solve the frame increment pointer issue.

Building MITK with the current GDCM release-2-2 branch (2.2.6) allows us to load C-Arm CT images again.
Unfortunately, the mitkDICOMSeriesReaderTest gets a SegFault and throws the following Warnings:

GDCM-src/Source/DataStructureAndEncodingDefinition/gdcmReader.cxx, line 582, function bool gdcm::Reader::InternalReadCommon(const T_Caller&) [with T_Caller = gdcm::details::DefaultCaller]
Attempt to read file with VR16bits

GDCM-src/Source/DataStructureAndEncodingDefinition/gdcmVR16ExplicitDataElement.txx, line 124, function std::istream& gdcm::VR16ExplicitDataElement::ReadPreValue(std::istream&) [with TSwap = gdcm::SwapperNoOp, std::istream = std::basic_istream<char>]
Assuming 16 bits VR for Tag=(343a,3a35) in order to read a buggy DICOM file.

GDCM-src/Source/DataStructureAndEncodingDefinition/gdcmReader.cxx, line 622, function bool gdcm::Reader::InternalReadCommon(const T_Caller&) [with T_Caller = gdcm::details::DefaultCaller]
Attempt to read file with explicit/implicit

We therefore postpone updating to the newest GDCM after release.

This bug should be fixed within the next release