Skip to content

Commit 66af872

Browse files
committed
Explicitly disallow MeasurementReport with no imaging measurements
1 parent a4dfcb5 commit 66af872

2 files changed

Lines changed: 48 additions & 21 deletions

File tree

src/highdicom/sr/templates.py

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4269,31 +4269,46 @@ def __init__(
42694269
PlanarROIMeasurementsAndQualitativeEvaluations |
42704270
VolumetricROIMeasurementsAndQualitativeEvaluations
42714271
)
4272-
if imaging_measurements is not None:
4273-
measurement_types = (
4274-
PlanarROIMeasurementsAndQualitativeEvaluations,
4275-
VolumetricROIMeasurementsAndQualitativeEvaluations,
4276-
MeasurementsAndQualitativeEvaluations,
4272+
4273+
# Since only imaging meansurements are currently supported, at least
4274+
# one is required. This could be relaxed in the future if evaluations
4275+
# or derived measurements (rows 10 or 12 of the TID1500 table) are
4276+
# supported
4277+
if imaging_measurements is None:
4278+
raise TypeError(
4279+
"Argument 'imaging_measurements' is required."
42774280
)
4278-
container_item = ContainerContentItem(
4279-
name=codes.DCM.ImagingMeasurements,
4280-
relationship_type=RelationshipTypeValues.CONTAINS
4281+
4282+
if len(imaging_measurements) == 0:
4283+
raise ValueError(
4284+
"Argument 'imaging_measurements' must contain at least "
4285+
"one item."
42814286
)
4282-
container_item.ContentSequence = ContentSequence()
4283-
for measurements in imaging_measurements:
4284-
if not isinstance(measurements, measurement_types):
4285-
raise TypeError(
4286-
'Measurements must have one of the following types: '
4287-
'"{}"'.format(
4288-
'", "'.join(
4289-
[
4290-
t.__name__
4291-
for t in measurement_types
4292-
]
4293-
)
4287+
4288+
measurement_types = (
4289+
PlanarROIMeasurementsAndQualitativeEvaluations,
4290+
VolumetricROIMeasurementsAndQualitativeEvaluations,
4291+
MeasurementsAndQualitativeEvaluations,
4292+
)
4293+
container_item = ContainerContentItem(
4294+
name=codes.DCM.ImagingMeasurements,
4295+
relationship_type=RelationshipTypeValues.CONTAINS
4296+
)
4297+
container_item.ContentSequence = ContentSequence()
4298+
for measurements in imaging_measurements:
4299+
if not isinstance(measurements, measurement_types):
4300+
raise TypeError(
4301+
'Measurements must have one of the following types: '
4302+
'"{}"'.format(
4303+
'", "'.join(
4304+
[
4305+
t.__name__
4306+
for t in measurement_types
4307+
]
42944308
)
42954309
)
4296-
container_item.ContentSequence.extend(measurements)
4310+
)
4311+
container_item.ContentSequence.extend(measurements)
42974312
item.ContentSequence.append(container_item)
42984313
super().__init__([item], is_root=True)
42994314

tests/test_sr.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3851,6 +3851,18 @@ def test_from_sequence(self):
38513851
assert len(qualitative_evaluations) == 1
38523852
assert isinstance(qualitative_evaluations[0], QualitativeEvaluation)
38533853

3854+
def test_construction_none(self):
3855+
# Since only imaging meansurements are currently supported, at least
3856+
# one is required. This could be relaxed in the future if evaluations
3857+
# or derived measurements (rows 10 or 12 of the TID1500 table) are
3858+
# supported
3859+
msg = ("Argument 'imaging_measurements' is required.")
3860+
with pytest.raises(TypeError, match=msg):
3861+
_ = MeasurementReport(
3862+
observation_context=self._observation_context,
3863+
procedure_reported=self._procedure_reported,
3864+
)
3865+
38543866

38553867
class TestEnhancedSR(unittest.TestCase):
38563868

0 commit comments

Comments
 (0)