Source code for large_image_source_dicom.dicom_metadata
[docs]
def extract_dicom_metadata(dataset):
    # Extract any metadata we want to display from the dataset
    metadata = {}
    for field in TOP_LEVEL_METADATA_FIELDS:
        if field not in dataset:
            # This field is missing
            continue
        element = dataset[field]
        value = element.value
        if not value:
            # This field is blank
            continue
        if isinstance(value, list):
            value = ', '.join(value)
        metadata[element.name] = str(value)
    # The specimens are complex and many layers deep
    specimens = extract_specimen_metadata(dataset)
    if specimens:
        metadata['Specimens'] = specimens
    return metadata
# These are the top-level metadata fields we will look for
# (if available on the DICOM object)
TOP_LEVEL_METADATA_FIELDS = [
    'PatientID',
    'PatientName',
    'PatientSex',
    'PatientBirthDate',
    'AccessionNumber',
    'StudyID',
    'StudyDate',
    'StudyTime',
    'ClinicalTrialSponsorName',
    'ClinicalTrialProtocolID',
    'ClinicalTrialProtocolName',
    'ClinicalTrialSiteName',
    'Manufacturer',
    'ManufacturerModelName',
    'DeviceSerialNumber',
    'SoftwareVersions',
    'ReferringPhysicianName',
    'ModalitiesInStudy',
]
[docs]
def extract_specimen_metadata(dataset):
    # Specimens are complex and many layers deep.
    # This function tries to extract what we need from the specimens.
    output = []
    for specimen in getattr(dataset, 'SpecimenDescriptionSequence', []):
        metadata = {}
        if 'SpecimenIdentifier' in specimen:
            metadata['Identifier'] = specimen.SpecimenIdentifier
        if 'SpecimenShortDescription' in specimen:
            metadata['Description'] = specimen.SpecimenShortDescription
        structures = ', '.join(
            x.CodeMeaning for x in getattr(specimen, 'PrimaryAnatomicStructureSequence', [])
        )
        if structures:
            metadata['Anatomical Structure'] = structures
        preps = []
        for prep in getattr(specimen, 'SpecimenPreparationSequence', []):
            steps = {}
            for step in getattr(prep, 'SpecimenPreparationStepContentItemSequence', []):
                # Only extract entries that have both a name and a value
                if (len(getattr(step, 'ConceptCodeSequence', [])) > 0 and
                        len(getattr(step, 'ConceptNameCodeSequence', [])) > 0):
                    name = step.ConceptNameCodeSequence[0].CodeMeaning
                    value = step.ConceptCodeSequence[0].CodeMeaning
                    if name in steps:
                        # There must be several values for this name.
                        # Turn it into a list instead.
                        if not isinstance(steps[name], list):
                            steps[name] = [steps[name]]
                        steps[name].append(value)
                    else:
                        steps[name] = value
            if steps:
                preps.append(steps)
        if preps:
            metadata['Specimen Preparation'] = preps
        if metadata:
            output.append(metadata)
    return output