def set_metadata(self, tag, value, force_vr=None): # Do not update the metadata if no metadata is present. if self.metadata is None: return None set_pydicom_meta_tag(dcm_seq=self.metadata, tag=tag, value=value, force_vr=force_vr)
def rename(self, new): if self.metadata is not None: # Obtain the old name old = self.name if not self.has_metadata(tag=(0x3006, 0x0020)): raise ValueError( f"The DICOM metaheader does not contain a Structure Set ROI sequence." ) # Iterate over roi elements in the roi sequence for ii, roi_element in enumerate(self.metadata[0x3006, 0x0020]): # Find ROI name that matches the old name if get_pydicom_meta_tag(dcm_seq=roi_element, tag=(0x3006, 0x0026), tag_type="str") == old: set_pydicom_meta_tag(dcm_seq=roi_element, tag=(0x3006, 0x0026), value=new) # Assign a new name self.name = new else: # Assign a new name self.name = new
def update_dicom_header(self, dcm): # Update unit of pixel values voxel_unit = "CM2ML" if self.suv_type == "BSA" else "GML" set_pydicom_meta_tag(dcm_seq=dcm, tag=(0x0054, 0x1001), value=voxel_unit) # Update the SUV type set_pydicom_meta_tag(dcm_seq=dcm, tag=(0x0054, 0x1006), value=self.suv_type) # Decay correction set_pydicom_meta_tag(dcm_seq=dcm, tag=(0x0054, 0x1102), value=self.decay_correction) # Add DECY to the image corrections, if this was not done previously. image_corrections = get_pydicom_meta_tag(dcm_seq=dcm, tag=(0x0028, 0x0051), tag_type="mult_str", default=[]) if "DECY" not in image_corrections: image_corrections += ["DECY"] set_pydicom_meta_tag(dcm_seq=dcm, tag=(0x0028, 0x0051), value=image_corrections) # Update the image type image_type = get_pydicom_meta_tag(dcm_seq=dcm, tag=(0x0008, 0x0008), tag_type="mult_str", default=[]) if len(image_type) > 2: image_type[0] = "DERIVED" image_type[1] = "SECONDARY" else: image_type = ["DERIVED", "SECONDARY"] set_pydicom_meta_tag(dcm_seq=dcm, tag=(0x0008, 0x0008), value=image_type) return dcm
def _convert_to_parametric_map_iod(self): if self.metadata is None: return None # Create a copy of the metadata. old_dcm: FileDataset = copy.deepcopy(self.metadata) # Update the SOP class to that of a parametric map image self.set_metadata(tag=(0x0008, 0x0016), value="1.2.840.10008.5.1.4.1.1.30") # Update the image type attribute image_type = self.get_metadata(tag=(0x0008, 0x0008), tag_type="mult_str", default=[]) image_type = [image_type[ii] if ii < len(image_type) else "" for ii in range(4)] image_type[0] = "DERIVED" image_type[1] = "PRIMARY" image_type[2] = image_type[2] if not image_type[2] == "" else "STATIC" image_type[3] = "MIXED" if self.spat_transform == "base" else "FILTERED" self.set_metadata(tag=(0x0008, 0x0008), value=image_type) # Parametric Map Image module attributes that may be missing. self.cond_set_metadata(tag=(0x2050, 0x0020), value="IDENTITY") # Presentation LUT shape self.cond_set_metadata(tag=(0x0018, 0x9004), value="RESEARCH") # Content qualification self.cond_set_metadata(tag=(0x0028, 0x0301), value="NO") # Burned-in Annotation self.cond_set_metadata(tag=(0x0028, 0x0302), value="YES") # Recognisable facial features self.cond_set_metadata(tag=(0x0070, 0x0080), value=self.get_export_descriptor().upper().strip()[:15]) # Content label self.cond_set_metadata(tag=(0x0070, 0x0081), value=self.get_export_descriptor()[:63]) # Content description self.cond_set_metadata(tag=(0x0070, 0x0084), value="Doe^John") # Set the source instance sequence source_instance_list = [] for reference_instance_sop_uid in self.slice_table.sop_instance_uid: ref_inst = Dataset() set_pydicom_meta_tag(dcm_seq=ref_inst, tag=(0x0008, 0x1150), value=get_pydicom_meta_tag(dcm_seq=old_dcm, tag=(0x0008, 0x0016), tag_type="str")) set_pydicom_meta_tag(dcm_seq=ref_inst, tag=(0x0008, 0x1155), value=reference_instance_sop_uid) source_instance_list += [ref_inst] self.set_metadata(tag=(0x0008, 0x2112), value=Sequence(source_instance_list)) # Attributes from the enhanced general equipment module may be missing. self.cond_set_metadata(tag=(0x0008, 0x0070), value="unknown") # Manufacturer self.cond_set_metadata(tag=(0x0008, 0x1090), value="unknown") # Model name self.cond_set_metadata(tag=(0x0018, 0x1000), value="unknown") # Device Serial Number self.set_metadata(tag=(0x0018, 0x1020), value="MIRP " + get_version()) # Items from multi-frame function groups may be missing. We currently only use a single frame. self.set_metadata(tag=(0x5200, 0x9229), value=Sequence()) # Shared functional groups sequence self.set_metadata(tag=(0x5200, 0x9230), value=Sequence()) # Per-frame functional groups sequence # Multi-frame Dimension module # Dimension organisation sequence. We copy the frame of reference as UID. dim_org_seq_elem = Dataset() set_pydicom_meta_tag(dim_org_seq_elem, tag=(0x0020, 0x9164), value=self.get_metadata(tag=(0x0020, 0x0052), tag_type="str")) # Dimension organisation UID self.set_metadata(tag=(0x0020, 0x9221), value=Sequence([dim_org_seq_elem])) # Dimension Index sequence. We point to the instance number. dim_index_seq_elem = Dataset() set_pydicom_meta_tag(dim_index_seq_elem, tag=(0x0020, 0x9165), value=(0x0020, 0x0013)) # Dimension index pointer set_pydicom_meta_tag(dim_index_seq_elem, tag=(0x0020, 0x9164), value=self.get_metadata(tag=(0x00200052), tag_type="str")) # Dimension organisation UID self.set_metadata(tag=(0x0020, 0x9222), value=Sequence([dim_index_seq_elem]))