Skip to content

Commit 0cc8cce

Browse files
authored
Merge pull request #315 from Fedalto/fix-sr-image-library-optional-tags
Fix SR if `SpacingBetweenSlices` is not set
2 parents eeff002 + daf918e commit 0cc8cce

2 files changed

Lines changed: 98 additions & 67 deletions

File tree

src/highdicom/sr/templates.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4015,12 +4015,6 @@ def _generate_cross_sectional_descriptors(
40154015
relationship_type=RelationshipTypeValues.HAS_ACQ_CONTEXT,
40164016
unit=codes.UCUM.Millimeter
40174017
),
4018-
NumContentItem(
4019-
name=codes.DCM.SpacingBetweenSlices,
4020-
value=dataset.SpacingBetweenSlices,
4021-
relationship_type=RelationshipTypeValues.HAS_ACQ_CONTEXT,
4022-
unit=codes.UCUM.Millimeter
4023-
),
40244018
NumContentItem(
40254019
name=codes.DCM.SliceThickness,
40264020
value=dataset.SliceThickness,
@@ -4106,6 +4100,16 @@ def _generate_cross_sectional_descriptors(
41064100
)
41074101
)
41084102
]
4103+
if hasattr(dataset, 'SpacingBetweenSlices'):
4104+
descriptors.append(
4105+
NumContentItem(
4106+
name=codes.DCM.SpacingBetweenSlices,
4107+
value=dataset.SpacingBetweenSlices,
4108+
relationship_type=RelationshipTypeValues.HAS_ACQ_CONTEXT,
4109+
unit=codes.UCUM.Millimeter
4110+
),
4111+
)
4112+
41094113
return descriptors
41104114

41114115
def _is_cross_sectional(self, ds: Dataset) -> bool:

tests/test_sr.py

Lines changed: 88 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -5419,79 +5419,101 @@ def test_ct_construction(self):
54195419
image=self._ref_ct_dataset,
54205420
)
54215421
assert len(group) == 17
5422-
assert isinstance(group[0], CodeContentItem)
5423-
assert group[0].name == codes.DCM.Modality
5424-
assert group[0].value == codes.cid29.ComputedTomography
5425-
assert isinstance(group[1], UIDRefContentItem)
5426-
assert group[1].name == codes.DCM.FrameOfReferenceUID
5427-
assert group[1].value == self._ref_ct_dataset.FrameOfReferenceUID
5428-
assert isinstance(group[2], NumContentItem)
5429-
assert group[2].name == codes.DCM.PixelDataRows
5430-
assert group[2].value == self._ref_ct_dataset.Rows
5431-
assert isinstance(group[3], NumContentItem)
5432-
assert group[3].name == codes.DCM.PixelDataColumns
5433-
assert group[3].value == self._ref_ct_dataset.Columns
5434-
assert isinstance(group[4], NumContentItem)
5435-
assert group[4].name == codes.DCM.HorizontalPixelSpacing
5436-
assert group[4].value == self._ref_ct_dataset.PixelSpacing[0]
5437-
value_item = group[4].MeasuredValueSequence[0]
5422+
5423+
# Check Modality
5424+
modality = group.find(name=codes.DCM.Modality)[0]
5425+
assert isinstance(modality, CodeContentItem)
5426+
assert modality.value == codes.cid29.ComputedTomography
5427+
5428+
# Check Frame of Reference UID
5429+
frame_ref = group.find(name=codes.DCM.FrameOfReferenceUID)[0]
5430+
assert isinstance(frame_ref, UIDRefContentItem)
5431+
assert frame_ref.value == self._ref_ct_dataset.FrameOfReferenceUID
5432+
5433+
# Check Pixel Data Rows
5434+
rows = group.find(name=codes.DCM.PixelDataRows)[0]
5435+
assert isinstance(rows, NumContentItem)
5436+
assert rows.value == self._ref_ct_dataset.Rows
5437+
5438+
# Check Pixel Data Columns
5439+
columns = group.find(name=codes.DCM.PixelDataColumns)[0]
5440+
assert isinstance(columns, NumContentItem)
5441+
assert columns.value == self._ref_ct_dataset.Columns
5442+
5443+
# Check Horizontal Pixel Spacing
5444+
h_spacing = group.find(name=codes.DCM.HorizontalPixelSpacing)[0]
5445+
assert isinstance(h_spacing, NumContentItem)
5446+
assert h_spacing.value == self._ref_ct_dataset.PixelSpacing[0]
5447+
value_item = h_spacing.MeasuredValueSequence[0]
54385448
unit_code_item = value_item.MeasurementUnitsCodeSequence[0]
54395449
assert unit_code_item.CodeValue == 'mm'
54405450
assert unit_code_item.CodeMeaning == 'mm'
54415451
assert unit_code_item.CodingSchemeDesignator == 'UCUM'
5442-
assert isinstance(group[5], NumContentItem)
5443-
assert group[5].name == codes.DCM.VerticalPixelSpacing
5444-
assert group[5].value == self._ref_ct_dataset.PixelSpacing[1]
5445-
assert isinstance(group[6], NumContentItem)
5446-
assert group[6].name == codes.DCM.SpacingBetweenSlices
5447-
assert group[6].value == self._ref_ct_dataset.SpacingBetweenSlices
5448-
value_item = group[6].MeasuredValueSequence[0]
5452+
5453+
# Check Vertical Pixel Spacing
5454+
v_spacing = group.find(name=codes.DCM.VerticalPixelSpacing)[0]
5455+
assert isinstance(v_spacing, NumContentItem)
5456+
assert v_spacing.value == self._ref_ct_dataset.PixelSpacing[1]
5457+
5458+
# Check Spacing Between Slices
5459+
slice_spacing = group.find(name=codes.DCM.SpacingBetweenSlices)[0]
5460+
assert isinstance(slice_spacing, NumContentItem)
5461+
assert slice_spacing.value == self._ref_ct_dataset.SpacingBetweenSlices
5462+
value_item = slice_spacing.MeasuredValueSequence[0]
54495463
unit_code_item = value_item.MeasurementUnitsCodeSequence[0]
54505464
assert unit_code_item.CodeValue == 'mm'
54515465
assert unit_code_item.CodeMeaning == 'mm'
54525466
assert unit_code_item.CodingSchemeDesignator == 'UCUM'
5453-
assert isinstance(group[7], NumContentItem)
5454-
assert group[7].name == codes.DCM.SliceThickness
5455-
assert group[7].value == self._ref_ct_dataset.SliceThickness
5456-
assert isinstance(group[8], NumContentItem)
5457-
assert group[8].name == codes.DCM.ImagePositionPatientX
5458-
assert group[8].value == self._ref_ct_dataset.ImagePositionPatient[0]
5459-
assert isinstance(group[9], NumContentItem)
5460-
assert group[9].name == codes.DCM.ImagePositionPatientY
5461-
assert group[9].value == self._ref_ct_dataset.ImagePositionPatient[1]
5462-
assert isinstance(group[10], NumContentItem)
5463-
assert group[10].name == codes.DCM.ImagePositionPatientZ
5464-
assert group[10].value == self._ref_ct_dataset.ImagePositionPatient[2]
5465-
assert isinstance(group[11], NumContentItem)
5466-
assert group[11].name == codes.DCM.ImageOrientationPatientRowX
5467-
assert group[11].value == \
5468-
self._ref_ct_dataset.ImageOrientationPatient[0]
5469-
value_item = group[11].MeasuredValueSequence[0]
5467+
5468+
# Check Slice Thickness
5469+
thickness = group.find(name=codes.DCM.SliceThickness)[0]
5470+
assert isinstance(thickness, NumContentItem)
5471+
assert thickness.value == self._ref_ct_dataset.SliceThickness
5472+
5473+
# Check Image Position Patient
5474+
pos_x = group.find(name=codes.DCM.ImagePositionPatientX)[0]
5475+
assert isinstance(pos_x, NumContentItem)
5476+
assert pos_x.value == self._ref_ct_dataset.ImagePositionPatient[0]
5477+
5478+
pos_y = group.find(name=codes.DCM.ImagePositionPatientY)[0]
5479+
assert isinstance(pos_y, NumContentItem)
5480+
assert pos_y.value == self._ref_ct_dataset.ImagePositionPatient[1]
5481+
5482+
pos_z = group.find(name=codes.DCM.ImagePositionPatientZ)[0]
5483+
assert isinstance(pos_z, NumContentItem)
5484+
assert pos_z.value == self._ref_ct_dataset.ImagePositionPatient[2]
5485+
5486+
# Check Image Orientation Patient Row
5487+
row_x = group.find(name=codes.DCM.ImageOrientationPatientRowX)[0]
5488+
assert isinstance(row_x, NumContentItem)
5489+
assert row_x.value == self._ref_ct_dataset.ImageOrientationPatient[0]
5490+
value_item = row_x.MeasuredValueSequence[0]
54705491
unit_code_item = value_item.MeasurementUnitsCodeSequence[0]
54715492
assert unit_code_item.CodeValue == '{-1:1}'
54725493
assert unit_code_item.CodeMeaning == '{-1:1}'
54735494
assert unit_code_item.CodingSchemeDesignator == 'UCUM'
5474-
assert isinstance(group[12], NumContentItem)
5475-
assert group[12].name == codes.DCM.ImageOrientationPatientRowY
5476-
assert group[12].value == \
5477-
self._ref_ct_dataset.ImageOrientationPatient[1]
5478-
assert isinstance(group[13], NumContentItem)
5479-
assert group[13].name == codes.DCM.ImageOrientationPatientRowZ
5480-
assert group[13].value == \
5481-
self._ref_ct_dataset.ImageOrientationPatient[2]
5482-
assert isinstance(group[14], NumContentItem)
5483-
assert group[14].name == codes.DCM.ImageOrientationPatientColumnX
5484-
assert group[14].value == \
5485-
self._ref_ct_dataset.ImageOrientationPatient[3]
5486-
assert isinstance(group[15], NumContentItem)
5487-
assert group[15].name == codes.DCM.ImageOrientationPatientColumnY
5488-
assert group[15].value == \
5489-
self._ref_ct_dataset.ImageOrientationPatient[4]
5490-
assert isinstance(group[16], NumContentItem)
5491-
assert group[16].name == codes.DCM.ImageOrientationPatientColumnZ
5492-
assert group[16].value == \
5493-
self._ref_ct_dataset.ImageOrientationPatient[5]
5494-
value_item = group[16].MeasuredValueSequence[0]
5495+
5496+
row_y = group.find(name=codes.DCM.ImageOrientationPatientRowY)[0]
5497+
assert isinstance(row_y, NumContentItem)
5498+
assert row_y.value == self._ref_ct_dataset.ImageOrientationPatient[1]
5499+
5500+
row_z = group.find(name=codes.DCM.ImageOrientationPatientRowZ)[0]
5501+
assert isinstance(row_z, NumContentItem)
5502+
assert row_z.value == self._ref_ct_dataset.ImageOrientationPatient[2]
5503+
5504+
# Check Image Orientation Patient Column
5505+
col_x = group.find(name=codes.DCM.ImageOrientationPatientColumnX)[0]
5506+
assert isinstance(col_x, NumContentItem)
5507+
assert col_x.value == self._ref_ct_dataset.ImageOrientationPatient[3]
5508+
5509+
col_y = group.find(name=codes.DCM.ImageOrientationPatientColumnY)[0]
5510+
assert isinstance(col_y, NumContentItem)
5511+
assert col_y.value == self._ref_ct_dataset.ImageOrientationPatient[4]
5512+
5513+
col_z = group.find(name=codes.DCM.ImageOrientationPatientColumnZ)[0]
5514+
assert isinstance(col_z, NumContentItem)
5515+
assert col_z.value == self._ref_ct_dataset.ImageOrientationPatient[5]
5516+
value_item = col_z.MeasuredValueSequence[0]
54955517
unit_code_item = value_item.MeasurementUnitsCodeSequence[0]
54965518
assert unit_code_item.CodeValue == '{-1:1}'
54975519
assert unit_code_item.CodeMeaning == '{-1:1}'
@@ -5591,6 +5613,11 @@ def test_dx_construction(self):
55915613
assert group[8].name == codes.DCM.ContentTime
55925614
assert group[8].value == content_time
55935615

5616+
def test_optional_spacing_between_slices(self):
5617+
del self._ref_ct_dataset.SpacingBetweenSlices
5618+
group = ImageLibraryEntryDescriptors(image=self._ref_ct_dataset)
5619+
assert not group.find(name=codes.DCM.SpacingBetweenSlices)
5620+
55945621

55955622
class TestImageLibrary(unittest.TestCase):
55965623

0 commit comments

Comments
 (0)