Exemple #1
0
    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)
Exemple #2
0
    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
Exemple #3
0
    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
Exemple #4
0
    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]))