Source code for cerr.dcm_export.iod_helper
# Module to populate iod elements common between different modalities
#
# APA, 4/3/2023
import SimpleITK as sitk
import os
from datetime import datetime
import numpy as np
from pydicom import dcmread
from pydicom.uid import generate_uid
from pydicom.dataset import Dataset, FileDataset, FileMetaDataset
from pydicom.sequence import Sequence
from pydicom.uid import ImplicitVRLittleEndian
import scipy.io as sio
import argparse
from random import randint
[docs]
def getFileMeta(dataType) -> FileMetaDataset:
file_meta = FileMetaDataset()
file_meta.FileMetaInformationGroupLength = 202
file_meta.FileMetaInformationVersion = b"\x00\x01"
file_meta.TransferSyntaxUID = ImplicitVRLittleEndian
if dataType == "CT":
dataClassUID = "1.2.840.10008.5.1.4.1.1.2"
elif dataType == "MR":
dataClassUID = "1.2.840.10008.5.1.4.1.1.4"
elif dataType == "SC":
dataClassUID = "1.2.840.10008.5.1.4.1.1.7"
elif dataType == "RTSTRUCT":
dataClassUID = "1.2.840.10008.5.1.4.1.1.481.3"
elif dataType == "REG":
dataClassUID = "1.2.840.10008.5.1.4.1.1.66.3"
elif dataType == "RTDOSE":
dataClassUID = "1.2.840.10008.5.1.4.1.1.481.2"
else:
raise Exception("Unsupported data type")
file_meta.MediaStorageSOPClassUID = dataClassUID
file_meta.MediaStorageSOPInstanceUID = generate_uid()
#file_meta.ImplementationClassUID = "1.2.246.352.70.2.1.160.3"
return file_meta
[docs]
def addEquipmentTags(ds: FileDataset, equipDict):
dt = datetime.now()
ds.Manufacturer = "pyCERR"
ds.ManufacturerModelName = "pyCERR"
ds.InstitutionName = "MSKCC"
# Set the transfer syntax
ds.is_little_endian = True
ds.is_implicit_VR = True
return ds
[docs]
def addStudyTags(ds: FileDataset, studyDict):
dt = datetime.now()
ds.StudyDate = studyDict["StudyDate"]
ds.StudyTime = studyDict["StudyTime"]
ds.StudyDescription = studyDict["StudyDescription"]
ds.StudyInstanceUID = studyDict["StudyInstanceUID"]
ds.StudyID = studyDict["StudyID"]
return ds
[docs]
def addSeriesTags(ds: FileDataset, seriesDict):
dt = datetime.now()
ds.Modality = seriesDict['Modality']
ds.SeriesDate = dt.strftime("%Y%m%d")
ds.SeriesTime = dt.strftime("%H%M%S.%f")
ds.SeriesDescription = seriesDict["SeriesDescription"]
ds.SeriesInstanceUID = generate_uid()
ds.SeriesNumber = seriesDict["SeriesNumber"] #str(randint(9010, 9900))
return ds
[docs]
def addPatientTags(ds: FileDataset, patDict):
ds.PatientName = patDict["PatientName"]
ds.PatientID = patDict["PatientID"]
ds.PatientBirthDate = patDict["PatientBirthDate"]
ds.PatientSex = patDict["PatientSex"]
ds.PatientAge = patDict["PatientAge"]
ds.PatientSize = patDict["PatientSize"]
ds.PatientWeight = patDict["PatientWeight"]
return ds
[docs]
def addContentTags(ds: FileDataset, contentDict):
dt = datetime.now()
ds.ContentCreatorName = ''
ds.ContentDate = dt.strftime("%Y%m%d")
ds.ContentTime = dt.strftime("%H%M%S.%f")
ds.ContentDescription = contentDict['ContentDescription'] #AI REGISTRATION'
ds.ContentLabel = contentDict['ContentLabel'] #"REGISTRATION"
return ds
[docs]
def addSOPCommonTags(ds: FileDataset):
dt = datetime.now()
ds.SpecificCharacterSet = "ISO_IR 192" # "ISO_IR 100"
ds.InstanceCreationDate = dt.strftime("%Y%m%d")
ds.InstanceCreationTime = dt.strftime("%H%M%S.%f")
# 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
return ds
[docs]
def addImagePlaneTags(ds: FileDataset):
# ds.PixelSpacing # 0028,0030 (mm)
# ds.ImageOrientation
# ds.ImagePosition
# ds.WindowCenter # optional, for scan
# ds.WindowWidth # optional, for scan
# ds.SliceThickness # optional, for scan
pass
[docs]
def addRefFORTags(ds_refFOR: Sequence):
#ds_refFOR.FrameOfReference
#s_refFOR.RTReferencedStudySequence = Sequence()
pass
[docs]
def addStructureSetTags(ds: FileDataset, structureDict):
# https://dicom.nema.org/dicom/2013/output/chtml/part03/sect_A.19.html
dt = datetime.now()
ds.StructureSetLabel = structureDict['StructureSetLabel'] # 3006,0002 Structure Set Label
ds.StructureSetTime = dt.strftime("%H%M%S.%f") # 3006,0008 Structure Set Date
ds.StructureSetDate = dt.strftime("%Y%m%d") # 3006,0009 Structure Set Time
ds.StructureSetDescription = structureDict['StructureSetDescription'] # 3006,0006 Structure Set Description
ds.InstanceNumber = structureDict['InstanceNumber'] # 3006,0013 Instance Number
ds.ReferencedFrameOfReferenceSequence = Sequence()
ds.StructureSetROISequence = Sequence()
ds.ROIContourSequence = Sequence()
ds.RTROIObservationsSequence = Sequence()
return ds