Source code for deid.dicom.header

__author__ = "Vanessa Sochat"
__copyright__ = "Copyright 2016-2022, Vanessa Sochat"
__license__ = "MIT"


import os

from pydicom import read_file

from deid.dicom.parser import DicomParser
from deid.dicom.utils import save_dicom
from deid.logger import bot

here = os.path.dirname(os.path.abspath(__file__))


[docs]def get_identifiers( dicom_files, force=True, config=None, strip_sequences=False, remove_private=False, disable_skip=False, expand_sequences=True, ): """ Extract all identifiers from a dicom image. This function returns a lookup by file name, where each value indexed includes a dictionary of nested fields (indexed by nested tag). Parameters ========== dicom_files: the dicom file(s) to extract from force: force reading the file (default True) config: if None, uses default in provided module folder strip_sequences: if True, remove all sequences remove_private: remove private tags disable_skip: do not skip over protected fields expand_sequences: if True, expand sequences. otherwise, skips """ if not isinstance(dicom_files, list): dicom_files = [dicom_files] bot.debug("Extracting identifiers for %s dicom" % len(dicom_files)) lookup = dict() # Parse each dicom file for dicom_file in dicom_files: parser = DicomParser(dicom_file, force=force, config=config, disable_skip=False) lookup[parser.dicom_file] = parser.get_fields(expand_sequences=expand_sequences) return lookup
[docs]def remove_private_identifiers( dicom_files, save=True, overwrite=False, output_folder=None, force=True ): """ Remove private identifiers. remove_private_identifiers is a wrapper for the simple call to dicom.remove_private_tags, it simply reads in the files for the user and saves accordingly """ updated_files = [] if not isinstance(dicom_files, list): dicom_files = [dicom_files] for dicom_file in dicom_files: dicom = read_file(dicom_file, force=force) dicom.remove_private_tags() dicom_name = os.path.basename(dicom_file) bot.debug("Removed private identifiers for %s" % dicom_name) if save: dicom = save_dicom( dicom=dicom, dicom_file=dicom_file, output_folder=output_folder, overwrite=overwrite, ) updated_files.append(dicom) return updated_files
[docs]def replace_identifiers( dicom_files, ids=None, deid=None, save=False, overwrite=False, output_folder=None, force=True, config=None, strip_sequences=False, remove_private=False, disable_skip=False, ): """ Replace identifiers. replace identifiers using pydicom, can be slow when writing and saving new files. If you want to replace sequences, they need to be extracted with get_identifiers and expand_sequences to True. """ if not isinstance(dicom_files, list): dicom_files = [dicom_files] # Warn the user that we use the default deid recipe if not deid: bot.warning("No deid specification provided, will use defaults.") # ids (a lookup) is not required ids = ids or {} # Parse through dicom files, update headers, and save updated_files = [] for dicom_file in dicom_files: parser = DicomParser( dicom_file, force=force, config=config, recipe=deid, disable_skip=disable_skip, ) # If a custom lookup was provided, update the parser if parser.dicom_file in ids: parser.lookup.update(ids[parser.dicom_file]) parser.parse(strip_sequences=strip_sequences, remove_private=remove_private) # Save to file, otherwise return updated objects if save is True: ds = save_dicom( dicom=parser.dicom, dicom_file=parser.dicom_file, output_folder=output_folder, overwrite=overwrite, ) updated_files.append(ds) else: updated_files.append(parser.dicom) return updated_files