def add_tag()

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