def DICOM_MR_backbone(self, SeriesInstanceUID): # Main data elements ds = Dataset() ds.SpecificCharacterSet = 'ISO_IR 101' # latin-2 ds.ImageType = ['ORIGINAL', 'PRIMARY', 'OTHER'] ds.SOPClassUID = '1.2.840.10008.5.1.4.1.1.4' # MR ds.SOPInstanceUID = f'2.5.{uuid.uuid4().int:d}' ds.StudyDate = '' # YYYYMMDD ds.StudyTime = '' # HHMMSS ds.AccessionNumber = '' ds.Modality = 'MR' ds.Manufacturer = 'Jakub Dzik' ds.ReferringPhysicianName = '' ds.PatientName = 'Anonymized' ds.PatientID = '1234' ds.PatientBirthDate = '' ds.PatientSex = '' ds.ContrastBolusAgent = '' ds.ScanningSequence = 'EP' ds.SequenceVariant = 'NONE' ds.ScanOptions = '' ds.MRAcquisitionType = '3D' ds.EchoTime = '' ds.EchoTrainLength = '' ds.PatientPosition = '' ds.StudyInstanceUID = self.StudyInstanceUID ds.SeriesInstanceUID = SeriesInstanceUID ds.StudyID = '' ds.AcquisitionNumber = '' ds.FrameOfReferenceUID = self.FrameOfReferenceUID ds.Laterality = '' ds.PositionReferenceIndicator = '' ds.SamplesPerPixel = 1 ds.PhotometricInterpretation = 'MONOCHROME2' ds.CommentsOnThePerformedProcedureStep = '' ds.RequestedProcedureID = 'MOZGOWIE' ds.ReasonForTheRequestedProcedure = '' ds.RequestedProcedurePriority = '' ds.PatientTransportArrangements = '' ds.RequestedProcedureLocation = '' ds.RequestedProcedureComments = '' ds.ReasonForTheImagingServiceRequest = '' ds.IssueDateOfImagingServiceRequest = '20210222' ds.IssueTimeOfImagingServiceRequest = '084604.947' ds.OrderEntererLocation = '' ds.OrderCallbackPhoneNumber = '' ds.ImagingServiceRequestComments = '' ds.PresentationLUTShape = 'IDENTITY' ds.is_implicit_VR = False ds.is_little_endian = True return ds
def generate_dicom(self, file_out_name: str, gantry_angle: float = 0.0, coll_angle: float = 0.0, table_angle: float = 0.0): file_meta = FileMetaDataset() file_meta.FileMetaInformationGroupLength = 196 file_meta.FileMetaInformationVersion = b'\x00\x01' file_meta.MediaStorageSOPClassUID = '1.2.840.10008.5.1.4.1.1.481.1' file_meta.MediaStorageSOPInstanceUID = '1.2.246.352.64.1.5468686515961995030.4457606667843517571' file_meta.TransferSyntaxUID = '1.2.840.10008.1.2' file_meta.ImplementationClassUID = '1.2.246.352.70.2.1.120.1' file_meta.ImplementationVersionName = 'MergeCOM3_410' # Main data elements ds = Dataset() ds.SpecificCharacterSet = 'ISO_IR 100' ds.ImageType = ['ORIGINAL', 'PRIMARY', 'PORTAL'] ds.InstanceCreationDate = '20161230' ds.InstanceCreationTime = '215510' ds.SOPClassUID = '1.2.840.10008.5.1.4.1.1.481.1' ds.SOPInstanceUID = '1.2.246.352.64.1.5468686515961995030.4457606667843517571' ds.StudyDate = '20161230' ds.ContentDate = '20161230' ds.StudyTime = '215441.936' ds.ContentTime = '215441.936' ds.AccessionNumber = '' ds.Modality = 'RTIMAGE' ds.ConversionType = '' ds.Manufacturer = 'Varian Medical Systems' ds.ReferringPhysicianName = '' ds.StationName = 'NDS-WKS-SN9999' ds.OperatorsName = 'King Kong' ds.ManufacturerModelName = 'VMS.XI.Service' ds.PatientName = 'Grace Hopper' ds.PatientID = 'VMS.XI.Service' ds.PatientBirthDate = '19000101' ds.PatientBirthTime = '000000' ds.PatientSex = '' ds.SoftwareVersions = '2.5.13.2' ds.StudyInstanceUID = '1.2.246.352.64.4.5644626269434644263.1905029945372990626' ds.SeriesInstanceUID = '1.2.246.352.64.2.5508761605912087323.11665958260371685307' ds.StudyID = 'fdd794f2-8520-4c4a-aecc-e4446c1730ff' ds.SeriesNumber = None ds.AcquisitionNumber = "739774555" ds.InstanceNumber = "1" ds.PatientOrientation = '' ds.FrameOfReferenceUID = '1.2.246.352.64.3.4714322356925391886.9391210174715030407' ds.PositionReferenceIndicator = '' ds.SamplesPerPixel = 1 ds.PhotometricInterpretation = 'MONOCHROME1' ds.PlanarConfiguration = 0 ds.Rows = self.shape[0] ds.Columns = self.shape[1] ds.BitsAllocated = 16 ds.BitsStored = 16 ds.HighBit = 15 ds.PixelRepresentation = 0 ds.WindowCenter = "32767.0" ds.WindowWidth = "65535.0" ds.RescaleIntercept = "0.0" ds.RescaleSlope = "1.0" ds.RescaleType = 'US' ds.RTImageLabel = 'MV_180' ds.RTImageDescription = "" ds.ReportedValuesOrigin = 'ACTUAL' ds.RTImagePlane = 'NORMAL' ds.XRayImageReceptorTranslation = [0.00, 0.00, 1000 - self.sid] ds.XRayImageReceptorAngle = "0.0" ds.RTImageOrientation = [1, 0, 0, 0, -1, 0] ds.ImagePlanePixelSpacing = [self.pixel_size, self.pixel_size] ds.RTImagePosition = [-214.872, 214.872] ds.RadiationMachineName = 'TrueBeam from Hell' ds.RadiationMachineSAD = "1000.0" ds.RTImageSID = self.sid ds.PrimaryDosimeterUnit = 'MU' ds.GantryAngle = str(gantry_angle) ds.BeamLimitingDeviceAngle = str(coll_angle) ds.PatientSupportAngle = str(table_angle) ds.TableTopVerticalPosition = "-24.59382842824" ds.TableTopLongitudinalPosition = "200.813502948597" ds.TableTopLateralPosition = "3.00246706215532" ds.PixelData = self.image # XXX Array of 3276800 bytes excluded ds.file_meta = file_meta ds.is_implicit_VR = True ds.is_little_endian = True ds.save_as(file_out_name, write_like_original=False)
def dcm_initialise(): ### This function based on pydicom codify output # File meta info data elements file_meta = Dataset() # file_meta.FileMetaInformationGroupLength = 194 ### REQUIRES DEFINITION file_meta.FileMetaInformationVersion = b'\x00\x01' file_meta.MediaStorageSOPClassUID = '1.2.840.10008.5.1.4.1.1.4' # file_meta.MediaStorageSOPInstanceUID = '1.2.40.0.13.1.75591523476291404472265359935487530723' ### REQUIRES DEFINITION file_meta.TransferSyntaxUID = '1.2.840.10008.1.2' file_meta.ImplementationClassUID = '1.2.276.0.7230010.3.0.3.6.1' file_meta.ImplementationVersionName = 'PERINATAL_CUSTOM_PYDICOM' # Main data elements ds = Dataset() ds.SpecificCharacterSet = 'ISO_IR 100' # ds.ImageType = ['ORIGINAL', 'PRIMARY', 'M_FFE', 'M', 'FFE'] ### REQUIRES DEFINITION ds.InstanceCreationDate = '' ds.InstanceCreationTime = '' ds.InstanceCreatorUID = '1.2.40.0.13.1.203399489339977079628124438700844270739' ### TODO: determine if required ds.SOPClassUID = '1.2.840.10008.5.1.4.1.1.4' # ds.SOPInstanceUID = '1.2.40.0.13.1.75591523476291404472265359935487530723' ### REQUIRES DEFINITION ds.StudyDate = '' ds.SeriesDate = '' ds.AcquisitionDate = '' ds.ContentDate = '' ds.StudyTime = '' ds.SeriesTime = '' # '182511.32000' ds.AcquisitionTime = '' # '182511.32' ds.ContentTime = '' # '182511.32' ds.AccessionNumber = '' ds.Modality = 'MR' ds.Manufacturer = 'Philips Healthcare' ds.CodeValue = '' ds.CodingSchemeDesignator = 'DCM' ds.CodeMeaning = '' # Procedure Code Sequence procedure_code_sequence = Sequence() ds.ProcedureCodeSequence = procedure_code_sequence # Procedure Code Sequence: Procedure Code 1 procedure_code1 = Dataset() procedure_code1.CodeValue = '' # 'RA.MRAAOT' procedure_code1.CodingSchemeDesignator = '' # '99ORBIS' procedure_code1.CodeMeaning = '' # 'CE-MRA Aorta thorakal' procedure_code1.ContextGroupExtensionFlag = 'N' procedure_code_sequence.append(procedure_code1) ds.OperatorsName = '' ds.AdmittingDiagnosesDescription = '' ds.ManufacturerModelName = 'Ingenia' # Referenced Performed Procedure Step Sequence refd_performed_procedure_step_sequence = Sequence() ds.ReferencedPerformedProcedureStepSequence = refd_performed_procedure_step_sequence # Referenced Performed Procedure Step Sequence: Referenced Performed Procedure Step 1 refd_performed_procedure_step1 = Dataset() refd_performed_procedure_step1.InstanceCreationDate = '' refd_performed_procedure_step1.InstanceCreationTime = '' refd_performed_procedure_step1.InstanceCreatorUID = '1.2.40.0.13.1.203399489339977079628124438700844270739' ### TODO: determine if required refd_performed_procedure_step1.ReferencedSOPClassUID = '1.2.840.10008.3.1.2.3.3' refd_performed_procedure_step1.ReferencedSOPInstanceUID = '1.3.46.670589.11.17204.5.0.6524.2012082117320696006' refd_performed_procedure_step1.InstanceNumber = "0" refd_performed_procedure_step_sequence.append( refd_performed_procedure_step1) # Referenced Image Sequence refd_image_sequence = Sequence() ds.ReferencedImageSequence = refd_image_sequence # Referenced Image Sequence: Referenced Image 1 refd_image1 = Dataset() refd_image1.ReferencedSOPClassUID = '1.2.840.10008.5.1.4.1.1.4' refd_image1.ReferencedSOPInstanceUID = '1.2.40.0.13.1.89078282904346598403696206113943676723' refd_image_sequence.append(refd_image1) # Referenced Image Sequence: Referenced Image 2 refd_image2 = Dataset() refd_image2.ReferencedSOPClassUID = '1.2.840.10008.5.1.4.1.1.4' refd_image2.ReferencedSOPInstanceUID = '1.2.40.0.13.1.295129673873169057216869911833080985343' refd_image_sequence.append(refd_image2) # Referenced Image Sequence: Referenced Image 3 refd_image3 = Dataset() refd_image3.ReferencedSOPClassUID = '1.2.840.10008.5.1.4.1.1.4' refd_image3.ReferencedSOPInstanceUID = '1.2.40.0.13.1.37560432539838529536104187971339317428' refd_image_sequence.append(refd_image3) ds.PatientName = 'Not Specified' ds.PatientID = 'Not Specified' ds.PrivateCreator = 'Philips Imaging' ds.IssuerOfPatientID = '' ds.PatientBirthDate = '' ds.OtherPatientIDs = '' ds.OtherPatientNames = '' ds.PatientMotherBirthName = '' # ds.PregnancyStatus = 4 ds.ScanningSequence = 'kt bFFE' # 'GR' ds.SequenceVariant = '' # 'SP' ds.ScanOptions = '' # 'FC' ds.MRAcquisitionType = '3D' ds.SequenceName = '' ds.SliceThickness = '' ds.RepetitionTime = "3.8" ds.EchoTime = "1.9" ds.NumberOfAverages = "1" ds.ImagingFrequency = "127.768401" ds.ImagedNucleus = '1H' ds.EchoNumbers = "1" ds.MagneticFieldStrength = "1.5" ds.SpacingBetweenSlices = "" ds.NumberOfPhaseEncodingSteps = "" # "143" ds.EchoTrainLength = "" # "3" ds.PercentSampling = "" # "98.4375" ds.PercentPhaseFieldOfView = "" # "86.4864871376439" ds.PixelBandwidth = "" # "3284" ds.SoftwareVersions = ['5.1.7', '5.1.7.2'] ds.ProtocolName = 'Not Specified' # ds.TriggerTime = "622" ### REQUIRES DEFINITION # ds.LowRRValue = "632" # Not sure if needed # ds.HighRRValue = "733" # Not sure if needed ds.IntervalsAcquired = "" # "1132" ds.IntervalsRejected = "" # "20" ds.HeartRate = "" ds.ReconstructionDiameter = "" # "379.999992370605" ds.ReceiveCoilName = 'MULTI COIL' ds.TransmitCoilName = 'B' # ds.AcquisitionMatrix = [0, 148, 143, 0] # TODO: Determine if required ds.InPlanePhaseEncodingDirection = '' # 'ROW' ds.FlipAngle = "60" ds.SAR = "" ds.dBdt = "" ds.PatientPosition = '' # 'HFS' TODO: Determine if important/required # ds.AcquisitionDuration = 459.6679992675781 # TODO: Determine if important/required ds.DiffusionBValue = 0.0 ds.DiffusionGradientOrientation = [0.0, 0.0, 0.0] ds.StudyInstanceUID = '1.2.40.0.13.1.333311361771566580913219583914625766216' # TODO: determine if needs generating ds.SeriesInstanceUID = '1.2.40.0.13.1.286595144572817015845933344548631223145' # TODO: determine if needs generating ds.StudyID = '513842.201207030' # TODO: determine if needs generating ds.SeriesNumber = "" ds.AcquisitionNumber = "" # "10" # ds.InstanceNumber = "319" ### REQUIRES DEFINITION # ds.ImagePositionPatient = ['-56.040032677094', '-189.81796011867', '225.026188065538'] ### REQUIRES DEFINITION # ds.ImageOrientationPatient = ['0.51319164037704', '0.85772150754928', '-0.0307911429554', '-0.0599991045892', '6.4554493292E-05', '-0.9981984496116'] ### TODO: decide if need to match Nifti affine ds.FrameOfReferenceUID = '1.2.40.0.13.1.168070265634523572089252568290704983898' # TODO: determine if required ds.TemporalPositionIdentifier = "" # "1" ds.NumberOfTemporalPositions = "" # "1" ds.PositionReferenceIndicator = '' # ds.SliceLocation = "38.9999961150011" ### REQUIRES DEFINITION ds.SamplesPerPixel = 1 ds.PhotometricInterpretation = 'MONOCHROME2' # ds.Rows = 192 ### REQUIRES DEFINITION # ds.Columns = 192 ### REQUIRES DEFINITION # ds.PixelSpacing = ['1.97916662693023', '1.97916662693023'] ### REQUIRES DEFINITION ds.BitsAllocated = 16 ds.BitsStored = 12 ds.HighBit = 11 ds.PixelRepresentation = 0 # ds.WindowCenter = "213.04" ### REQUIRES DEFINITION # ds.WindowWidth = "370.49" ### REQUIRES DEFINITION ds.LossyImageCompression = '00' ds.RequestingPhysician = '' ds.RequestingService = '' ds.RequestedProcedureDescription = 'FCMR 4D FLOW MRI' ds.PerformedStationAETitle = '' ds.PerformedProcedureStepStartDate = '' # '20120821' ds.PerformedProcedureStepStartTime = '' # '173207' ds.PerformedProcedureStepEndDate = '' # '20120821' ds.PerformedProcedureStepEndTime = '' # '173207' ds.PerformedProcedureStepID = '' # '398712726' ds.PerformedProcedureStepDescription = '' # 'CE-MRA Aorta thorakal' # Performed Protocol Code Sequence performed_protocol_code_sequence = Sequence() ds.PerformedProtocolCodeSequence = performed_protocol_code_sequence # Performed Protocol Code Sequence: Performed Protocol Code 1 performed_protocol_code1 = Dataset() performed_protocol_code1.CodeValue = '' # 'RA.MRAAOT' performed_protocol_code1.CodingSchemeDesignator = '' # '99ORBIS' performed_protocol_code1.CodeMeaning = '' # 'CE-MRA Aorta thorakal' performed_protocol_code1.ContextGroupExtensionFlag = 'N' performed_protocol_code_sequence.append(performed_protocol_code1) # Film Consumption Sequence film_consumption_sequence = Sequence() ds.FilmConsumptionSequence = film_consumption_sequence ds.RequestedProcedureID = '513842.201207030' # Real World Value Mapping Sequence real_world_value_mapping_sequence = Sequence() ds.RealWorldValueMappingSequence = real_world_value_mapping_sequence # Real World Value Mapping Sequence: Real World Value Mapping 1 real_world_value_mapping1 = Dataset() real_world_value_mapping1.RealWorldValueIntercept = 0.0 real_world_value_mapping1.RealWorldValueSlope = 0.0 # 4.280830280830281 real_world_value_mapping_sequence.append(real_world_value_mapping1) ds.PresentationLUTShape = 'IDENTITY' return file_meta, ds