in pathology/transformation_pipeline/ingestion_lib/dicom_util/dicom_iod_util.py [0:0]
def add_tag(self, tag: DICOMTag):
"""Add/merges DICOM tag definition into the DICOM dataset.
The same tag can be described in multiple modules.
Tag requirements may not be the same. This code merges
tag definitions.
Args:
tag: Tag to being added.
Raises:
DICOMSpecMetadataError if assumptions that iod
module tags have same Address, VR, VM defitions is not met.
"""
existing_tag = self._dataset.get(tag.address)
if existing_tag is None:
# new tag
self._dataset[tag.address] = tag
else:
# merge tag definition into an existing definition
# validate core assumptions match for both tags.
if tag.address != existing_tag.address:
raise dcm_util.DICOMSpecMetadataError(
f'Merged tag address do not match; Tag 1:{existing_tag}; '
f'Tag 2: {tag}'
)
for vr in tag.vr:
if vr not in existing_tag.vr:
raise dcm_util.DICOMSpecMetadataError(
'Merged tag vr type definitions do not '
f'match; Tag 1:{existing_tag}; '
f'Tag 2: {tag}'
)
if tag.vm != existing_tag.vm:
raise dcm_util.DICOMSpecMetadataError(
'Merged tag vm multiplicty do not match; '
f'Tag 1:{existing_tag}; Tag 2: {tag}'
)
for req in tag.required:
existing_tag.required.add(req)
for usage in tag.module_usage:
existing_tag.module_usage.add(usage)
if existing_tag.is_sq():
# if dataset is a sequence merge sequence.
if existing_tag.sq_dataset is None:
existing_tag.sq_dataset = tag.sq_dataset
else:
existing_tag.sq_dataset.merge(tag.sq_dataset) # pytype: disable=attribute-error # always-use-return-annotations