Source code for dicom_creation

import datetime
import pytomography
from pydicom.uid import generate_uid
from pydicom.dataset import Dataset, FileDataset, FileMetaDataset
from pydicom.sequence import Sequence
from pydicom.uid import ImplicitVRLittleEndian
from pydicom.uid import PYDICOM_IMPLEMENTATION_UID

[docs]def get_file_meta(SOP_instance_UID, SOP_class_UID) -> FileMetaDataset: file_meta = FileMetaDataset() file_meta.FileMetaInformationGroupLength = 202 file_meta.FileMetaInformationVersion = b"\x00\x01" file_meta.TransferSyntaxUID = ImplicitVRLittleEndian #file_meta.MediaStorageSOPClassUID = '1.2.840.10008.5.1.4.1.1.128' file_meta.MediaStorageSOPClassUID = SOP_class_UID file_meta.MediaStorageSOPInstanceUID = (SOP_instance_UID) file_meta.ImplementationClassUID = PYDICOM_IMPLEMENTATION_UID return file_meta
[docs]def generate_base_dataset(SOP_instance_UID, SOP_class_UID) -> FileDataset: file_name = "pydicom-reconstruction" file_meta = get_file_meta(SOP_instance_UID, SOP_class_UID) ds = FileDataset(file_name, {}, file_meta=file_meta, preamble=b"\0" * 128) add_required_elements_to_ds(ds) return ds
[docs]def add_required_elements_to_ds(ds: FileDataset): dt = datetime.datetime.now() # Append data elements required by the DICOM standarad ds.SpecificCharacterSet = "ISO_IR 100" ds.InstanceCreationDate = dt.strftime("%Y%m%d") ds.InstanceCreationTime = dt.strftime("%H%M%S.%f") ds.Manufacturer = "Qurit" ds.ManufacturerModelName = f"PyTomography {pytomography.__version__}" ds.InstitutionName = "Qurit" # Set the transfer syntax ds.is_little_endian = True ds.is_implicit_VR = True # Set values already defined in the file meta ds.SOPClassUID = ds.file_meta.MediaStorageSOPClassUID ds.SOPInstanceUID = ds.file_meta.MediaStorageSOPInstanceUID ds.ApprovalStatus = "UNAPPROVED"
[docs]def add_study_and_series_information(ds: FileDataset, reference_ds): ds.StudyDate = reference_ds.StudyDate ds.SeriesDate = getattr(reference_ds, "SeriesDate", "") ds.StudyTime = reference_ds.StudyTime ds.SeriesTime = getattr(reference_ds, "SeriesTime", "") ds.StudyDescription = getattr(reference_ds, "StudyDescription", "") ds.SeriesDescription = getattr(reference_ds, "SeriesDescription", "") ds.StudyInstanceUID = reference_ds.StudyInstanceUID ds.SeriesInstanceUID = generate_uid() # TODO: find out if random generation is ok ds.StudyID = reference_ds.StudyID ds.SeriesNumber = "1" # TODO: find out if we can just use 1 (Should be fine since its a new series) ds.FrameOfReferenceUID = getattr(reference_ds, 'FrameOfReferenceUID', generate_uid())
[docs]def add_patient_information(ds: FileDataset, reference_ds): ds.PatientName = getattr(reference_ds, "PatientName", "") ds.PatientID = getattr(reference_ds, "PatientID", "") ds.PatientBirthDate = getattr(reference_ds, "PatientBirthDate", "") ds.PatientSex = getattr(reference_ds, "PatientSex", "") ds.PatientAge = getattr(reference_ds, "PatientAge", "") ds.PatientSize = getattr(reference_ds, "PatientSize", "") ds.PatientWeight = getattr(reference_ds, "PatientWeight", "")
[docs]def create_ds(reference_ds, SOP_instance_UID, SOP_class_UID, modality): ds = generate_base_dataset(SOP_instance_UID, SOP_class_UID) add_study_and_series_information(ds, reference_ds) add_patient_information(ds, reference_ds) ds.Modality = modality return ds