in pathology/transformation_pipeline/ingestion_lib/dicom_gen/dicom_schema_util.py [0:0]
def _validate_and_init_schema_dicom_tag(self):
"""Validates DICOM tag schema definition and further inits tag.
Raises:
DICOMSchemaTagError: error in schema tag def
"""
tagkw = self.get_schema_key_val(_SchemaTagKeywords.KEYWORD)
try:
if SchemaDICOMTag.get_kw_address(tagkw) != self._address:
raise DICOMSchemaTagError(
self,
(
'Schema tag keyword does not resolve to '
f' specified address; keyword: {tagkw};'
f' keyword: {tagkw} != {self._address}'
),
)
except DICOMSchemaError as exp:
raise DICOMSchemaTagError(
self,
(
'Schema tag keyword does not resolve to '
f' address; keyword: {tagkw};\n'
f'exception: {traceback.format_exc()}'
),
) from exp
tag_param = []
for test_param in [
_SchemaTagKeywords.META,
_SchemaTagKeywords.STATIC_VALUE,
_SchemaTagKeywords.SQ,
_SchemaTagKeywords.SEQ,
]:
sq = self.get_schema_key_val(test_param)
if sq is not None:
tag_param.append(test_param)
if not tag_param:
raise DICOMSchemaTagError(
self, 'Tag is missing expected value def: META, STATIC_VALUE, or SQ'
)
if len(tag_param) > 1:
raise DICOMSchemaTagError(
self,
(
'Tag definition has multiple [META, '
'STATIC_VALUE, or SQ] value defs. '
f'Tag defines: {str(tag_param)}'
),
)
self._schema_tag_value_source = tag_param[0]
self._meta_join = self.get_schema_key_val(_SchemaTagKeywords.META_JOIN)
if self._meta_join is not None and not isinstance(self._meta_join, str):
raise DICOMSchemaTagError(
self, 'Invalid meta_join value. Must be a string.'
)
value_limit = self.get_schema_key_val(_SchemaTagKeywords.VALUE_CHAR_LIMIT)
if value_limit is not None:
if isinstance(
value_limit, str
) and SchemaDICOMTag._valid_value_char_limit(value_limit):
self._value_char_limit = value_limit
else:
raise DICOMSchemaTagError(
self, 'Invalid value_limit. Must be a valid string.'
)
conditional_on = self.get_schema_key_val(_SchemaTagKeywords.CONDITIONAL_ON)
if conditional_on is not None:
if isinstance(conditional_on, str):
m_name = norm_column_name(conditional_on)
self._conditional_on.add(m_name)
else:
for m_name in conditional_on:
m_name = norm_column_name(m_name)
self._conditional_on.add(m_name)
write_uninit = self.get_schema_key_val(_SchemaTagKeywords.WRITE_EMPTY)
if write_uninit is not None:
write_uninit = norm_column_name(write_uninit)
if write_uninit not in (
_SchemaTagKeywords.TRUE,
_SchemaTagKeywords.FALSE,
):
raise DICOMSchemaTagError(
self,
(
'WRITE_EMPTY expects "TRUE" or "FALSE"'
f' values; WRITE_EMPTY: {write_uninit}'
),
)
self._write_uninitialized = write_uninit == _SchemaTagKeywords.TRUE
required = self.get_schema_key_val(_SchemaTagKeywords.REQUIRED)
if required is not None:
required = norm_column_name(str(required))
if required not in (_SchemaTagKeywords.TRUE, _SchemaTagKeywords.FALSE):
raise DICOMSchemaTagError(
self,
(
'REQUIRED expects "TRUE" or "FALSE"'
f' values; WRITE_EMPTY: {required}'
),
)
self._tag_value_definition_required = required == _SchemaTagKeywords.TRUE
else:
self._tag_value_definition_required = (
ingest_flags.REQUIRE_TYPE1_DICOM_TAG_METADATA_IS_DEFINED_FLG.value
and SchemaDICOMTag._has_vals_in(self._table_req, [_DICOM_TYPE_1_TAG])
)
if SchemaDICOMTag._has_vals_in(self._table_req, [_DICOM_TYPE_2_TAG]):
self._write_uninitialized = True
if not self.is_seq and self.is_tag_schema_define_seq():
raise DICOMSchemaTagError(self, 'Tags which are not SQ VR cannot be SQ.')
elif self.is_seq and not self.is_tag_schema_define_seq():
raise DICOMSchemaTagError(
self, 'SQ VR type tags must be initialized as SQ'
)
if (
self.is_tag_schema_define_seq()
and not isinstance(self.seq_metadata, list)
and not isinstance(self.seq_metadata, dict)
):
raise DICOMSchemaTagError(
self, '"SQ" should be set to a list of datasets.'
)