diff --git a/mu_map/file/dicom_to_interfile.py b/mu_map/file/dicom_to_interfile.py index 5c8005ffe035cb73a4565a2727db8b31470be013..98a4c4eb50842ade37a83a62c418462475532d45 100644 --- a/mu_map/file/dicom_to_interfile.py +++ b/mu_map/file/dicom_to_interfile.py @@ -3,7 +3,7 @@ from typing import Dict, Tuple import numpy as np from pydicom.dataset import FileDataset as DCMImage -from mu_map.file.interfile import HEADER_TEMPLATE, parse_interfile_header_str +from mu_map.file.interfile import TEMPLATE_HEADER_IMAGE, parse_interfile_header_str def to_interfile(dcm: DCMImage, image: np.ndarray) -> Tuple[Dict[str, str], np.ndarray]: @@ -14,7 +14,7 @@ def to_interfile(dcm: DCMImage, image: np.ndarray) -> Tuple[Dict[str, str], np.n :param image: the image as a numpy array :return: the header and image in INTERFILE format """ - header = HEADER_TEMPLATE.replace("{ROWS}", str(dcm.Rows)) + header = TEMPLATE_HEADER_IMAGE.replace("{ROWS}", str(dcm.Rows)) header = header.replace("{SPACING_X}", f"{dcm.PixelSpacing[0]:.4f}") header = header.replace("{COLUMNS}", str(dcm.Columns)) header = header.replace("{SPACING_Y}", f"{dcm.PixelSpacing[1]:.4f}") diff --git a/mu_map/file/interfile.py b/mu_map/file/interfile.py index c879af12639f7eddfd27013fd09731d4f73379ec..0bb63896a2e36db3e33450fc6dc559cde97b78e2 100644 --- a/mu_map/file/interfile.py +++ b/mu_map/file/interfile.py @@ -3,56 +3,58 @@ from typing import Dict, Tuple import numpy as np +Interfile = Tuple[Dict[str, str], np.ndarray] + """ Several keys defined in INTERFILE headers. """ -KEY_DIM_1 = "!matrix size [1]" -KEY_DIM_2 = "!matrix size [2]" -KEY_DIM_3 = "!matrix size [3]" +KEY_DIM_1 = "matrix size [1]" +KEY_DIM_2 = "matrix size [2]" +KEY_DIM_3 = "matrix size [3]" KEY_SPACING_1 = "scaling factor (mm/pixel) [1]" KEY_SPACING_2 = "scaling factor (mm/pixel) [2]" KEY_SPACING_3 = "scaling factor (mm/pixel) [2]" -KEY_NPROJECTIONS = "!number of projections" +KEY_NPROJECTIONS = "number of projections" KEY_DATA_FILE = "name of data file" -KEY_BYTES_PER_PIXEL = "!number of bytes per pixel" -KEY_NUMBER_FORMAT = "!number format" +KEY_BYTES_PER_PIXEL = "number of bytes per pixel" +KEY_NUMBER_FORMAT = "number format" """ A template of an INTERFILE header. """ -HEADER_TEMPLATE = """ -!INTERFILE := -!imaging modality := nucmed -!version of keys := STIR4.0 +TEMPLATE_HEADER_IMAGE = """ +INTERFILE := +imaging modality := nucmed +version of keys := STIR4.0 name of data file := {DATA_FILE} -!GENERAL DATA := -!GENERAL IMAGE DATA := -!type of data := Tomographic +GENERAL DATA := +GENERAL IMAGE DATA := +type of data := Tomographic imagedata byte order := LITTLEENDIAN isotope name := ^99m^Technetium -!SPECT STUDY (General) := +SPECT STUDY (General) := process status := Reconstructed -!number format := float -!number of bytes per pixel := 4 +number format := float +number of bytes per pixel := 4 number of dimensions := 3 matrix axis label [1] := x -!matrix size [1] := {ROWS} +matrix size [1] := {ROWS} scaling factor (mm/pixel) [1] := {SPACING_X} matrix axis label [2] := y -!matrix size [2] := {COLUMNS} +matrix size [2] := {COLUMNS} scaling factor (mm/pixel) [2] := {SPACING_Y} matrix axis label [3] := z -!matrix size [3] := {SLICES} +matrix size [3] := {SLICES} scaling factor (mm/pixel) [3] := {SPACING_Z} first pixel offset (mm) [1] := {OFFSET_X} first pixel offset (mm) [2] := {OFFSET_Y} first pixel offset (mm) [3] := 0 number of time frames := 1 -!END OF INTERFILE := +END OF INTERFILE := """ @@ -80,6 +82,7 @@ def parse_interfile_header_str(header: str) -> Dict[str, str]: :param header: the text of an INTERFILE header :return: a dictionary of value in the header """ + header = header.replace("!", "") lines = header.strip().split("\n") items = map(lambda line: line.split(":="), lines) items = filter(lambda item: len(item) == 2, items)