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