From 16dd819dd63dad88a9ef626e830274908607aec7 Mon Sep 17 00:00:00 2001 From: carlvillads Date: Fri, 21 Nov 2025 11:03:21 +0100 Subject: [PATCH 1/4] move math import to own line --- rhscripts/dcm.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rhscripts/dcm.py b/rhscripts/dcm.py index b243166..74fa1f9 100755 --- a/rhscripts/dcm.py +++ b/rhscripts/dcm.py @@ -1,5 +1,6 @@ #!/usr/bin/env python -import os, math +import os +import math import pydicom as dicom import configparser import glob From fed91c89cea824dc8536d1903b195eb95037bffe Mon Sep 17 00:00:00 2001 From: carlvillads Date: Fri, 21 Nov 2025 16:16:51 +0100 Subject: [PATCH 2/4] add time_tag parameter to get_suv_constants to get the correct timepoint for multi-image PET series with fallback method --- rhscripts/dcm.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/rhscripts/dcm.py b/rhscripts/dcm.py index 74fa1f9..571f4ea 100755 --- a/rhscripts/dcm.py +++ b/rhscripts/dcm.py @@ -228,13 +228,20 @@ def anonymize_folder(self,foldername: str,output_foldername: str, def get_suv_constants( file:Union[str, Path, dicom.Dataset], - overwrite_values:Dict=None + overwrite_values:Dict=None, + time_tag:str='series' ) -> Tuple[Dict, Callable[[float], float]]: """ Extract the constants used for SUV normalization Parameters ---------- file: Path to string with dicom dataset, or pre-loaded dicom dataset + time_tag: + DICOM tag to base time calculation on. Can be either `series` or `acquisition` + + `series` (default): Use Series Time tag `(0008,0031)`. **Reccomended method**, as this does not change if a PET scan has multiple views + + `acquisition`: Uses Acquisition Time tag `(0008,0032)`. This is not always the correct time for SUV-bw calculations. Returns ------- @@ -253,7 +260,18 @@ def get_suv_constants( inj_time = ds[0x54,0x16][0][0x18,0x1072].value # Scan time - acq_time = ds.AcquisitionTime + if time_tag == 'series': + # Series time + try: + acq_time = ds[0x0008,0x0031].value + except KeyError as e: # fall back on acq time if series times isn't available + acq_time = ds.AcquisitionTime + print(f"Warning: Falling back to Acquisition Time (0008,0032)! The selected DICOM file or dataset does not have the Series Time (0008,0031) available: {e}") + elif time_tag == 'acquisition': + # Acquisition time + acq_time = ds.AcquisitionTime + else: + raise ValueError("'time_tag' must be 'series' or 'acquisition'") # Injected dose dose = int(ds[0x54,0x16][0][0x18,0x1074].value) From 9c08a99e7409cfcc5a13275db700026c2f5c0a5f Mon Sep 17 00:00:00 2001 From: carlvillads Date: Fri, 21 Nov 2025 16:17:17 +0100 Subject: [PATCH 3/4] update dcmread in get_suv_constants to stop before pixels --- rhscripts/dcm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rhscripts/dcm.py b/rhscripts/dcm.py index 571f4ea..b366305 100755 --- a/rhscripts/dcm.py +++ b/rhscripts/dcm.py @@ -252,7 +252,7 @@ def get_suv_constants( """ if isinstance(file, (str, Path)): - ds = dcmread(file) + ds = dcmread(file, stop_before_pixels=True) else: ds = file From afc95f27be94ff88271820713ae2e2900557afc7 Mon Sep 17 00:00:00 2001 From: carlvillads Date: Wed, 26 Nov 2025 10:11:58 +0100 Subject: [PATCH 4/4] remove fallback for series time tag in get_suv_constants --- rhscripts/dcm.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/rhscripts/dcm.py b/rhscripts/dcm.py index b366305..c95accf 100755 --- a/rhscripts/dcm.py +++ b/rhscripts/dcm.py @@ -261,14 +261,8 @@ def get_suv_constants( # Scan time if time_tag == 'series': - # Series time - try: - acq_time = ds[0x0008,0x0031].value - except KeyError as e: # fall back on acq time if series times isn't available - acq_time = ds.AcquisitionTime - print(f"Warning: Falling back to Acquisition Time (0008,0032)! The selected DICOM file or dataset does not have the Series Time (0008,0031) available: {e}") + acq_time = ds[0x0008,0x0031].value # Series time elif time_tag == 'acquisition': - # Acquisition time acq_time = ds.AcquisitionTime else: raise ValueError("'time_tag' must be 'series' or 'acquisition'")