pathology/transformation_pipeline/ingestion_lib/ingest_const.py (427 lines of code) (raw):

# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================== """Constants used in transformation pipeline.""" import dataclasses from typing import NewType HEALTHCARE_API = 'https://healthcare.googleapis.com/v1' # Private creator tag def. PRIVATE_TAG_CREATOR = 'GOOGLE' SC_MANUFACTURER_NAME = 'GOOGLE' # DICOM UIDs used in ingest pipeline. # Google Implentation Class UID. SC_IMPLEMENTATION_CLASS_UID = '1.3.6.1.4.1.11129.5.4.1' WSI_IMPLEMENTATION_CLASS_UID = '1.3.6.1.4.1.11129.5.4.1' SCMI_IMPLEMENTATION_CLASS_UID = '1.3.6.1.4.1.11129.5.4.1' IMPLEMENTATION_VERSION_NAME = 'GooglePathTrans' # Max len 16 characters # UID prefix based on Google UID prefix used to generate UIDs. # https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_6.2.html DPAS_UID_PREFIX = '1.3.6.1.4.1.11129.5.7' MESSAGE_TTL_S = int(600) # wsi image and frame type keywords OVERVIEW = 'OVERVIEW' THUMBNAIL = 'THUMBNAIL' LABEL = 'LABEL' DERIVED = 'DERIVED' MONOCHROME2 = 'MONOCHROME2' SECONDARY = 'SECONDARY' ORIGINAL = 'ORIGINAL' PRIMARY = 'PRIMARY' VOLUME = 'VOLUME' NONE = 'NONE' RESAMPLED = 'RESAMPLED' ORIGINAL_PRIMARY_VOLUME = f'{ORIGINAL}\\{PRIMARY}\\{VOLUME}' ORIGINAL_PRIMARY_VOLUME_RESAMPLED = ( f'{ORIGINAL}\\{PRIMARY}\\{VOLUME}\\{RESAMPLED}' ) DERIVED_PRIMARY_VOLUME = f'{DERIVED}\\{PRIMARY}\\{VOLUME}' DERIVED_PRIMARY_VOLUME_RESAMPLED = ( f'{DERIVED}\\{PRIMARY}\\{VOLUME}\\{RESAMPLED}' ) TILED_FULL = 'TILED_FULL' MISSING_INGESTION_TRACE_ID = 'MISSING_INGESTION_TRACE_ID' VALUE = 'Value' VR = 'vr' class DICOMVRCodes: CS = 'CS' LO = 'LO' LT = 'LT' PN = 'PN' SH = 'SH' SQ = 'SQ' UI = 'UI' class DICOMTagAddress: """HEX address of DICOM tags.""" ACCESSION_NUMBER = '00080050' DICOM_GOOGLE_PRIVATE_CREATOR_BLOCK_TAG = '30210010' HASH_PRIVATE_TAG = '30211001' INGEST_FILENAME_TAG = '30211004' OOF_SCORE_PRIVATE_TAG = '30211002' PATIENT_ID = '00100020' PATIENT_NAME = '00100010' PUBSUB_MESSAGE_ID_TAG = '30211003' PYRAMID_LABEL = '00200027' PYRAMID_DESCRIPTION = '00081088' PYRAMID_UID = '00080019' SERIES_DESCRIPTION = '0008103E' SERIES_INSTANCE_UID = '0020000E' SOP_CLASS_UID = '00080016' SOP_INSTANCE_UID = '00080018' STUDY_INSTANCE_UID = '0020000D' class DICOMTagKeywords: """DICOM Keywords used in ingest project.""" ACCESSION_NUMBER = 'AccessionNumber' ACQUISITION_DATE = 'AcquisitionDate' ACQUISITION_DATE_TIME = 'AcquisitionDateTime' ACQUISITION_TIME = 'AcquisitionTime' BARCODE_VALUE = 'BarcodeValue' BITS_ALLOCATED = 'BitsAllocated' BITS_STORED = 'BitsStored' BURNED_IN_ANNOTATION = 'BurnedInAnnotation' COLOR_SPACE = 'ColorSpace' COLUMNS = 'Columns' CONCATENATION_FRAME_OFFSET_NUMBER = 'ConcatenationFrameOffsetNumber' CONCATENATION_UID = 'ConcatenationUID' CONTENT_DATE = 'ContentDate' CONTENT_TIME = 'ContentTime' DEVICE_SERIAL_NUMBER = 'DeviceSerialNumber' DICOM_GOOGLE_PRIVATE_CREATOR_BLOCK_TAG = ( DICOMTagAddress.DICOM_GOOGLE_PRIVATE_CREATOR_BLOCK_TAG ) DIMENSION_ORGANIZATION_TYPE = 'DimensionOrganizationType' EXTENDED_DEPTH_OF_FIELD = 'ExtendedDepthOfField' FOCUS_METHOD = 'FocusMethod' FRAME_OF_REFERENCE_UID = 'FrameOfReferenceUID' FRAME_TYPE = 'FrameType' GROUP_ADDRESS = '3021' HASH_PRIVATE_TAG = DICOMTagAddress.HASH_PRIVATE_TAG HIGH_BIT = 'HighBit' ICC_PROFILE = 'ICCProfile' IMAGE_ORIENTATION_SLIDE = 'ImageOrientationSlide' IMAGE_TYPE = 'ImageType' IMAGED_VOLUME_DEPTH = 'ImagedVolumeDepth' IMAGED_VOLUME_HEIGHT = 'ImagedVolumeHeight' IMAGED_VOLUME_WIDTH = 'ImagedVolumeWidth' IN_CONCATENATION_NUMBER = 'InConcatenationNumber' INGEST_FILENAME_TAG = DICOMTagAddress.INGEST_FILENAME_TAG INSTANCE_NUMBER = 'InstanceNumber' MANUFACTURER = 'Manufacturer' MANUFACTURER_MODEL_NAME = 'ManufacturerModelName' MODALITY = 'Modality' NUMBER_OF_FRAMES = 'NumberOfFrames' OOF_SCORE_PRIVATE_TAG = DICOMTagAddress.OOF_SCORE_PRIVATE_TAG OPTICAL_PATH_SEQUENCE = 'OpticalPathSequence' PATIENT_ID = 'PatientID' PATIENT_NAME = 'PatientName' PHOTOMETRIC_INTERPRETATION = 'PhotometricInterpretation' PIXEL_REPRESENTATION = 'PixelRepresentation' PLANAR_CONFIGURATION = 'PlanarConfiguration' POSITION_REFERENCE_INDICATOR = 'PositionReferenceIndicator' PUBSUB_MESSAGE_ID_TAG = DICOMTagAddress.PUBSUB_MESSAGE_ID_TAG PYRAMID_DESCRIPTION = 'PyramidDescription' PYRAMID_LABEL = 'PyramidLabel' PYRAMID_UID = 'PyramidUID' ROWS = 'Rows' SAMPLES_PER_PIXEL = 'SamplesPerPixel' SERIES_INSTANCE_UID = 'SeriesInstanceUID' SERIES_NUMBER = 'SeriesNumber' SHARED_FUNCTIONAL_GROUPS_SEQUENCE = 'SharedFunctionalGroupsSequence' SLICE_THICKNESS = 'SliceThickness' SOFTWARE_VERSIONS = 'SoftwareVersions' SOP_CLASS_UID = 'SOPClassUID' SOP_INSTANCE_UID = 'SOPInstanceUID' SPECIMEN_LABEL_IN_IMAGE = 'SpecimenLabelInImage' STUDY_INSTANCE_UID = 'StudyInstanceUID' TOTAL_PIXEL_MATRIX_COLUMNS = 'TotalPixelMatrixColumns' TOTAL_PIXEL_MATRIX_FOCAL_PLANES = 'TotalPixelMatrixFocalPlanes' TOTAL_PIXEL_MATRIX_ROWS = 'TotalPixelMatrixRows' TRANSFER_SYNTAX_UID = 'TransferSyntaxUID' VOLUMETRIC_PROPERTIES = 'VolumetricProperties' SOPClassUID = NewType('SOPClassUID', str) SOPClassName = NewType('SOPClassName', str) @dataclasses.dataclass(frozen=True) class DicomSopClass: name: SOPClassName uid: SOPClassUID class DicomSopClasses: """DICOM SOP Class values used in ingest project.""" MICROSCOPY_ANNOTATION = DicomSopClass( SOPClassName('Microscopy Bulk Simple Annotations Storage'), SOPClassUID('1.2.840.10008.5.1.4.1.1.91.1'), ) MICROSCOPIC_IMAGE = DicomSopClass( SOPClassName('VL Microscopic Image Storage'), SOPClassUID('1.2.840.10008.5.1.4.1.1.77.1.2'), ) SECONDARY_CAPTURE_IMAGE = DicomSopClass( SOPClassName('Secondary Capture Image Storage'), SOPClassUID('1.2.840.10008.5.1.4.1.1.7'), ) SLIDE_COORDINATES_IMAGE = DicomSopClass( SOPClassName('VL Slide-Coordinates Microscopic Image Storage'), SOPClassUID('1.2.840.10008.5.1.4.1.1.77.1.3'), ) WHOLE_SLIDE_IMAGE = DicomSopClass( SOPClassName('VL Whole Slide Microscopy Image Storage'), SOPClassUID('1.2.840.10008.5.1.4.1.1.77.1.6'), ) class ICCProfile: """ICC Profiles.""" ADOBERGB = 'ADOBERGB' ROMMRGB = 'ROMMRGB' NONE = 'NONE' SRGB = 'SRGB' class DicomImageTransferSyntax: """DICOM Transfer Syntaxs.""" # DICOM transfer syntaxs define pixel data encoding. # https://dicom.nema.org/medical/dicom/current/output/chtml/part06/chapter_a.html # DICOM default. Private tags not compatible with transfer syntax. # And are not returned by store on query. # DO NOT USE see b/207162516 IMPLICIT_VR_LITTLE_ENDIAN = '1.2.840.10008.1.2' # DO NOT USE poor performance DEFLATED_EXPLICIT_VR_LITTLE_ENDIAN = '1.2.840.10008.1.2.1.99' # Prefered transfer syntax EXPLICIT_VR_LITTLE_ENDIAN = '1.2.840.10008.1.2.1' # DO not use deprecated EXPLICIT_VR_BIG_ENDIAN = '1.2.840.10008.1.2.2' # encapsulated transfer syntaxs JPEG_LOSSY = '1.2.840.10008.1.2.4.50' JPEG_2000 = '1.2.840.10008.1.2.4.90' # https://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.7.6.html#sect_C.7.6.1.1.5.1 class DicomImageCompressionMethod: JPEG_LOSSY = 'ISO_10918_1' class RedisLockKeywords: """Keywords used to identify unique portions of redis lock values.""" DICOM_ACCESSION_NUMBER = 'DICOM_ACCESSION_NUMBER:%s' GCS_TRIGGERED_INGESTION = 'GCS_TRIGGERED SLIDEID:%s' DICOM_STORE_TRIGGERED_INGESTION = 'DICOM_STORE_TRIGGERED STORE:%s SLIDE_ID:%s' ML_TRIGGERED_INGESTION = ( 'ML_TRIGGERED STUDY_INSTANCE_UID:%s SERIES_INSTANCE_UID: %s' ) class PubSubKeywords: PIXEL_SPACING_WIDTH = 'PixelSpacingWidth' PIXEL_SPACING_HEIGHT = 'PixelSpacingHeight' class LogKeywords: """Keywords used in structured logs. Define all new constants in uppercase. Refactoring constants to uppercase to match global style. """ ACCESSION_NUMBER = 'accession_number' ACK_DEADLINE_SEC = 'ack_deadline_sec' BARCODE = 'barcode' BIGQUERY_TABLE = 'bigquery_table' BIGQUERY_TABLE_COLUMN_NAMES = 'bigquery_table_column_names' BUCKET_NAME = 'bucket_name' DEST_FILE = 'dest_file' DEST_URI = 'dest_URI' DICOM_INSTANCES_TRIGGERING_TRANSFORM_PIPELINE = ( 'dicom_instances_triggering_transform_pipeline' ) DICOM_TAGS = 'dicom_tags' DICOMWEB_PATH = 'dicomweb_path' DPAS_INGESTION_TRACE_ID = 'dpas_ingestion_trace_id' ELAPSED_TIME_BEYOND_EXTENSION_SEC = 'elapsed_time_beyond_extension_sec' EXCEPTION = 'exception' EXISTING_DICOM_INSTANCE = 'existing_dicom_instance' EXTENDING_ACK_DEADLINE_SEC = 'extending_ack_deadline_sec' FILE_EXTENSION = 'file_extension' FILE_NAME_PART_REGEX = 'file_name_slide_id_part_regex' FILE_NAME_PART_SPLIT_STRING = 'file_name_slide_id_part_split_string' FILE_SIZE = 'file_size(bytes)' FILENAME = 'filename' GCS_IGNORE_FILE_REGEXS = 'gcs_ignore_file_regexs' HASH = 'hash' IGNORE_FILE_BUCKET = 'ignore_file_bucket' INGESTION_HANDLER = 'ingestion_handler' INVALID_CHARACTER = 'invalid_character' LOCK_HELD_SEC = 'lock_held_sec' LOCK_NAME = 'lock_name' LOCK_TOKEN = 'lock_token' MAIN_DICOM_STORE = 'main_dicom_store' MATCHED_REGEX = 'matched_regex' MESSAGE_COUNT = 'message_count' METADATA = 'metadata' METADATA_PRIMARY_KEY = 'metadata_primary_key' METADATA_PRIMARY_KEY_COLUMN_NAME = 'metadata_primary_key_column_name' METADATA_SOURCE = 'metadata_source' NEW_SERIES_INSTANCE_UID = 'new_series_instance_uid' OLD_SERIES_INSTANCE_UID = 'old_series_instance_uid' OOF_DICOM_STORE = 'oof_dicom_store' PATIENT_ID = 'patient_id' PIPELINE_GENERATED_DOWNSAMPLE_DICOM_INSTANCE = ( 'pipeline_generated_downsample_dicom_instance' ) PREVIOUS_SERIES_INSTANCE_UID = 'previous_series_instance_uid' PREVIOUS_STUDY_INSTANCE_UID = 'previous_study_instance_uid' PUBSUB_MESSAGE_ID = 'pubsub_message_id' PUBSUB_SUBSCRIPTION = 'pubsub_subscription' PUBSUB_TOPIC_NAME = 'pubsub_topic_name' RECEIVED_EVENT_TYPE = 'received_event_type' REDIS_SERVER_IP = 'redis_server_ip' REDIS_SERVER_PORT = 'redis_server_port' RETURN_CODE = 'return-code' SERIES_INSTANCE_UID = 'series_instance_uid' SLIDE_ID = 'slide_id' SOP_CLASS_UID = 'sop_class_uid' SOP_INSTANCE_UID = 'sop_instance_uid' SOURCE_URI = 'source_URI' STDERR = 'stderr' STDOUT = 'stdout' STUDY_INSTANCE_UID = 'study_instance_uid' STUDY_INSTANCE_UIDS_FOUND = 'study_instance_uids_found' TAG_NUMBER = 'private_tag_number' TESTED_DICOM_INSTANCE = 'tested_dicom_instance' TOTAL_TIME_SEC = 'total_time_sec' TYPE2_AND_2C_TAGS_ADDED = 'type2_and_2c_tags_added' TYPE2_TAGS_ADDED = 'type2_tags_added' URI = 'uri' URL = 'url' class EnvVarNames: DICOM_STORE_TO_CLEAN = 'DICOM_STORE_TO_CLEAN' DICOMWEB_URL = 'DICOMWEB_URL' GCS_IGNORE_FILE_BUCKET = 'GCS_IGNORE_FILE_BUCKET' GCS_IGNORE_FILE_REGEXS = 'GCS_IGNORE_FILE_REGEXS' GCS_UPLOAD_IGNORE_FILE_EXT = 'GCS_UPLOAD_IGNORE_FILE_EXT' INGEST_COMPLETE_OOF_TRIGGER_PUBSUB_TOPIC = ( 'INGEST_COMPLETE_OOF_TRIGGER_PUBSUB_TOPIC' ) OOF_DICOMWEB_BASE_URL = 'OOF_DICOMWEB_BASE_URL' OOF_INFERENCE_CONFIG_PATH = 'OOF_INFERENCE_CONFIG_PATH' class OofPassThroughKeywords: DISABLE_TFEXAMPLE_WRITE = 'DISABLE_TFEXAMPLE_WRITE' DPAS_INGESTION_TRACE_ID = 'DICOM_INGESTION_TRACE_ID' SOURCE_DICOM_IN_MAIN_STORE = 'SOURCE_DICOM_IN_MAIN_STORE' class ErrorMsgs: """Simplified error messages. GCS ingestion may use this simplified error message for GCS failure bucket paths, which are passed as an additional args element in exceptions. """ ACQUIRING_LOCK_OUTSIDE_CONTEXT_BLOCK = 'acquiring_lock_outside_context_block' BQ_METADATA_NOT_FOUND = 'bigquery_metadata_not_found' BQ_METADATA_TABLE_ENV_FORMAT = ( 'big_query_metadata_table_env_incorrectly_formatted' ) COULD_NOT_ACQUIRE_LOCK = 'could_not_acquire_lock' INVALID_DICOM = 'invalid_dicom' INVALID_DICOM_STANDARD_REPRESENTATION = ( 'invalid_dicom_standard_representation' ) INVALID_ICC_PROFILE = 'invalid_icc_profile' INVALID_METADATA_SCHEMA = 'invalid_metadata_schema' MISSING_PIXEL_SPACING = 'missing_pixel_spacing' MISSING_SERIES_UID = 'missing_series_instance_uid_in_metadata' MISSING_STUDY_UID = 'missing_study_instance_uid_in_metadata' MISSING_ACCESSION_NUMBER = 'missing_accession_number_metadata' MISSING_ACCESSION_NUMBER_UNABLE_TO_CREATE_STUDY_INSTANCE_UID = ( 'metadata_is_missing_accession_number_unable_to_create_study_instance_uid' ) MISSING_PATIENT_ID = 'missing_patient_id_metadata' MISSING_TIFF_SERIES = 'missing_tiff_series' UNEXPECTED_EXCEPTION = 'unexpected_exception' WSI_DICOM_PAYLOAD_MISSING_DICOM_FILES = ( 'wsi_dicom_payload_missing_dicom_files' ) WSI_DICOM_STUDY_UID_METADATA_DICOM_MISMATCH = ( 'wsi_dicom_study_uid_metadata_dicom_mismatch' ) WSI_TO_DICOM_CONVERSION_FAILED = 'wsi_to_dicom_conversion_failed' WSI_TO_DICOM_INVALID_DICOM_GENERATED = 'wsi_to_dicom_invalid_dicom_generated' # Slide ID decoding error messages BARCODE_IMAGE_MISSING = 'slide_id_error__missing_barcode_containing_image' BARCODE_MISSING_FROM_IMAGES = 'slide_id_error__barcode_missing_from_images' CANDIDATE_SLIDE_ID_MISSING = 'slide_id_error__candidate_slide_id_missing' SLIDE_ID_DEFINED_ON_MULTIPLE_ROWS = ( 'slide_id_error__slide_id_defined_on_multiple_rows' ) FILE_NAME_CONTAINS_MULTIPLE_SLIDE_ID_CANDIDATES = ( 'slide_id_error__file_name_contains_multiple_slide_id_candidates' ) MULTIPLE_BARCODES_SLIDE_ID_CANDIDATES = ( 'slide_id_error__multiple_barcodes_decoded' ) SLIDE_ID_MISSING = 'slide_id_error__slide_id_missing' SLIDE_ID_MISSING_FROM_CSV_METADATA = ( 'slide_id_error__slide_metadata_primary_key_missing_from_csv_metadata' ) SLIDE_ID_MISSING_FROM_BQ_METADATA = 'slide_id_error__slide_metadata_primary_key_missing_from_big_query_metadata' FILENAME_MISSING_SLIDE_METADATA_PRIMARY_KEY = ( 'slide_id_error__filename_missing_slide_metadata_primary_key' ) INVALID_SLIDE_ID_LENGTH = 'slide_id_error__invalid_slide_id_length' UNSUPPORTED_DICOM_SECONDARY_CAPTURE_IMAGE = ( 'unsupported_dicom_secondary_capture_image' ) # Flat image error messages FLAT_IMAGE_FAILED_TO_CONVERT_TIF_TO_JPG = ( 'flat_image_failed_to_convert_tif_to_jpg' ) FLAT_IMAGE_FAILED_TO_OPEN = 'flat_image_failed_to_open' FLAT_IMAGE_UNEXPECTED_DIMENSIONS = 'flat_image_unexpected_dimensions' FLAT_IMAGE_UNEXPECTED_FORMAT = 'flat_image_unexpected_format' FLAT_IMAGE_UNEXPECTED_PIXEL_MODE = 'flat_image_unexpected_pixel_mode' # Metadata Mapping Schema Errors MISSING_METADATA_FOR_REQUIRED_DICOM_TAG = ( 'missing_metadata_for_required_dicom_tag' ) ERROR_UPLOADING_DICOM_TO_GCS = 'error_uploading_dicom_to_gcs' ERROR_DECODING_DICOM_STORE_STUDY_INSTANCE_UID_SEARCH_RESPONSE = ( 'error_decoding_dicom_store_study_instance_uid_search_response' ) # DICOM Validation Errors DICOM_UID_INCORRECTLY_FORMATTED = 'dicom_uid_incorrectly_formatted' DICOM_INSTANCE_ENCODED_WITH_UNSUPPORTED_TRANSFER_SYNTAX = ( 'dicom_instance_encoded_with_unsupported_transfer_syntax' ) WSI_DICOM_INSTANCE_PIXEL_NOT_ALLOCATED_WITH_8_BITS_PER_PIXEL = ( 'wsi_dicom_instance_pixel_not_allocated_with_8_bits_per_pixel' ) WSI_DICOM_INSTANCE_PIXEL_NOT_STORED_WITH_8_BITS_PER_PIXEL = ( 'wsi_dicom_instance_pixel_not_stored_with_8_bits_per_pixel' ) WSI_DICOM_INSTANCE_ENCODED_WITH_INVALID_HIGH_PIXEL_BIT = ( 'wsi_dicom_instance_encoded_with_invalid_high_pixel_bit' ) WSI_DICOM_INSTANCE_ENCODED_WITH_INVALID_SAMPLES_PER_PIXEL = ( 'wsi_dicom_instance_encoded_with_invalid_samples_per_pixel' ) WSI_DICOM_INSTANCE_HAS_0_FRAMES = 'wsi_dicom_instance_has_0_frames' WSI_DICOM_INSTANCE_HAS_0_ROWS = 'wsi_dicom_instance_has_0_rows' WSI_DICOM_INSTANCE_HAS_0_COLUMNS = 'wsi_dicom_instance_has_0_columns' WSI_DICOM_INSTANCE_HAS_0_TOTAL_PIXEL_MATRIX_ROWS = ( 'wsi_dicom_instance_has_0_total_pixel_matrix_rows' ) WSI_DICOM_SPECIMEN_LABEL_IN_IMAGE_NOT_YES_OR_NO = ( 'wsi_dicom_specimen_label_in_image_not_yes_or_no' ) WSI_DICOM_BURNED_IN_ANNOTATION_IN_IMAGE_NOT_YES_OR_NO = ( 'wsi_dicom_burned_in_annotation_in_image_not_yes_or_no' ) WSI_DICOM_INSTANCE_DOES_NOT_HAVE_EXPECTED_FRAME_COUNT = ( 'wsi_dicom_instance_does_not_have_expected_frame_count' ) WSI_DICOM_INSTANCE_HAS_INVALID_DIMENSIONAL_ORGANIZATION_TYPE = ( 'wsi_dicom_instance_has_invalid_dimensional_organization_type' ) WSI_DICOM_ANCILLARY_INSTANCE_TYPE_INDETERMINATE = ( 'wsi_dicom_ancillary_instance_type_indeterminate' ) WSI_DICOM_ANCILLARY_INSTANCE_HAS_MORE_THAN_ONE_FRAME = ( 'wsi_dicom_ancillary_instance_has_more_than_one_frame' ) DICOM_INSTANCE_NOT_FOUND = 'dicom_instance_not_found' DICOM_INSTANCE_MISSING_STUDY_INSTANCE_UID = ( 'dicom_instance_missing_study_instance_uid' ) DICOM_INSTANCE_MISSING_SERIES_INSTANCE_UID = ( 'dicom_instance_missing_series_instance_uid' ) DICOM_INSTANCE_MISSING_SOP_INSTANCE_UID = ( 'dicom_instance_missing_sop_instance_uid' ) DICOM_INSTANCE_MISSING_SOP_CLASS_UID = 'dicom_instance_missing_sop_class_uid' DICOM_INSTANCES_STUDY_INSTANCE_UID_DO_NOT_MATCH = ( 'dicom_instances_study_instance_uid_do_not_match' ) DICOM_INSTANCES_SERIES_INSTANCE_UID_DO_NOT_MATCH = ( 'dicom_instances_series_instance_uid_do_not_match' ) DICOM_INSTANCES_HAVE_DUPLICATE_SOP_INSTANCE_UID = ( 'dicom_instances_have_duplicate_sop_instance_uid' ) DICOM_INSTANCES_BARCODES_DO_NOT_MATCH = ( 'dicom_instances_barcodes_do_not_match' ) DICOM_INSTANCES_HAVE_MULTIPLE_PRIMARY_VOLUME_IMAGES = ( 'dicom_instances_have_multiple_primary_volume_images' ) DICOM_INSTANCES_HAVE_MULTIPLE_LABEL_IMAGES = ( 'dicom_instances_have_multiple_label_images' ) DICOM_INSTANCES_HAVE_MULTIPLE_OVERVIEW_IMAGES = ( 'dicom_instances_have_multiple_overview_images' ) DICOM_INSTANCES_HAVE_MULTIPLE_THUMBNAIL_IMAGES = ( 'dicom_instances_have_multiple_thumbnail_images' ) DICOM_INSTANCES_HAVE_MULTIPLE_ACCESSION_NUMBERS = ( 'dicom_instances_have_multiple_accession_numbers' ) DICOM_INSTANCES_HAVE_MULTIPLE_PATIENT_NAMES = ( 'dicom_instances_have_multiple_patient_names' ) DICOM_INSTANCES_HAVE_MULTIPLE_PATIENT_IDS = ( 'dicom_instances_have_multiple_patient_ids' ) DICOM_INSTANCE_HAS_UNSUPPORTED_TOTAL_PIXEL_MATRIX_FOCAL_PLANE_VALUE = ( 'dicom_instance_has_unsupported_total_pixel_matrix_focal_plane_value' ) DICOM_INSTANCES_DESCRIBE_MULTIPLE_MODALITIES = ( 'dicom_instances_describe_multiple_modalities' ) ERROR_OCCURRED_QUERYING_DICOM_STORE_UNABLE_TO_CREATE_STUDY_INSTANCE_UID = ( 'error_occurred_querying_dicom_store_unable_to_create_study_instance_uid' ) UNABLE_TO_CREATE_STUDY_INSTANCE_UID_ACCESSION_NUMBER_IS_ASSOCIATED_WITH_MULTIPLE_STUDY_INSTANCE_UID = 'unable_to_create_study_instance_uid_accession_number_is_associated_with_multiple_study_instance_uid'