PET Standard Uptake Value Computation

I have a question about the calculation formulas of SUV for PET, when i use the moudle " PETStandardUptakeValueComputation" and extension “PET DICOM”
As we know, the Suv formula is as follows

But I don’t know what’s the scan start time?Is it the Series Time or the Acquisition Time?
And their SUV results are different.

(0008,0031) TM 153348 # Series Time
(0008,0032) TM 154644.500000 # Acquisition Time
(0010,1030) DS 100.788 # Patient’s Weight
(0018,1072) TM 142110.000000 # Radiopharmaceutical Start Time
(0018,1074) DS 552410034.17969 # Radionuclide Total Dose
(0018,1075) DS 6586.2 # Radionuclide Half Life

Thank you very much.

1 Like

Up for this question

S. Standardized Uptake Value (SUV) - QIBA Wiki

1 Like

Thank you @issakomi for the reference. I am still in the process of trying to implement the activity concentration to SUV conversion algorithm.

Meanwhile, with this presentation: , I was finally able to get the PET Standard Update Value Computation module to work.

There were to issues I was dealing with:

(1) I didn’t know how to convert segment to LabelMapVolume (the “VOI” from the linked presentation). I managed to do it using this option:

(2) Initially, I have not understood the documentation correctly:

  • Input PET Volume (PETVolume): Input PET volume for SUVbw computation (must be the same volume as pointed to by the DICOM path!).

Source: PET Standard Uptake Value Computation — 3D Slicer documentation

It means, that you have to select the proper subdirectory within the DICOM directory with your data.

I.e., in my case it was the “0003” subdirectory:

If some upper-level directory was selected, i.e., the directory containing all the data (from the CD), or the “DCMS” directory, then I was getting the following error:

PET Standard Uptake Value Computation standard error:

WARNING: In /Volumes/D/S/S-0-build/ITK/Modules/IO/GDCM/src/itkGDCMSeriesFileNames.cxx, line 100
GDCMSeriesFileNames (0x7f993a69e530): No Series were found

PET Standard Uptake Value Computation standard output:
list.SUVOutputStringFile = /private/var/folders/8j/8tw8x4sx49384vtn35xcpwn00000gr/T/Slicer-mbuch/36400_O1g87aQq7f.params

Done reading the file /private/var/folders/8j/8tw8x4sx49384vtn35xcpwn00000gr/T/Slicer-mbuch/DGEAA_vtkMRMLScalarVolumeNodeE.nrrd

Done reading the file /private/var/folders/8j/8tw8x4sx49384vtn35xcpwn00000gr/T/Slicer-mbuch/DGEAA_vtkMRMLLabelMapVolumeNodeB.nrrd

In fact, I think it is the same error @akmal871026 was getting (for the same reason): How To Calculate The SUV

Btw., @issakomi , maybe do you know where can I find a source code for the PET Standard Update Value Computation module, or for the SUV Factor Calculator module? (I am still getting errors with SUV Factor Calculator) – I would like to use this source code to see how the activity concentration to SUV conversion is implemented there.

I think I found the source code: Slicer/PETStandardUptakeValueComputation.cxx at main · Slicer/Slicer · GitHub


It is great that you have been able to figure these out! It would not be hard to modernize this module to make it much more convenient to use:

  1. Allow using segmentation as input (without the need to manually export to labelmap volume) - for example, by temporarily creating a labelmap node for the computation
  2. Allow using a volume node as input (without the need to manually select some DICOM folders) - because the volume node contains DICOM UIDs that can be used to look up the filenames or any additional required DICOM fields

Would you be interested in working on this? We can help you with getting started.

1 Like

@lassoan , the modifications you mentioned would very helpful, indeed. I would also add a more general remark:

  1. Explain (e.g., in the documentation), how “raw” PET-CT values - activity concentration - are converted into SUVs, i.e., how the conversion algorithm work (with a link to the implementation in Slicer 3D).

Now it is not mentioned in the documentation, and there is no link to the RSNA’s wiki, nor to the scanner manufacturers documentation and manuals, and @issakomi has to provide the links on the forum each time someone asks about that :slight_smile:

I can give it a try with these modifications, but I’d start with some clarifications in the documentation, if you don’t mind. I tried to get to know where the sourcecode for the documentation is stored (PET Standard Uptake Value Computation — 3D Slicer documentation) , but “Edit on GitHub” redirects to the “includes”. Then, based on this commit message: ENH: Add automatically generated CLI module documentation · Slicer/Slicer@b82b68f · GitHub I thought that the docs are somehow generated based on the XML files, e.g.: Slicer/PETStandardUptakeValueComputation.xml at main · Slicer/Slicer · GitHub , but it seems they are generated some other way. If you could give me a hint, a link to some Developer guide about how the docs are generated, I’d suggest some changes in a pull request.

I managed to re-implement the conversion algorithm. The process of getting to this result, including references to Slicer modules’ source code and RSNA’s documentation can be found in my post: Calculating SUVmax for GE’s PET/CT scanner – Mind Your Data. Maybe someone will find it helpful.

Analyzing the Slicer’s implementation of the conversion algorithm, there is also a direct answer to @qimo601 's original question: scan start time is Series Time (0008,0031), see: Slicer-PETDICOMExtension/SUVFactorCalculator.cxx at master · QIICR/Slicer-PETDICOMExtension · GitHub

Interestingly, I am still unable to get exactly the same SUVmax results as GE’s Work Station for a given ROI. We are getting about 5% differences, and I have no idea yet what may be causing this.

Hi Mikołaj.

Thanks so much for looking at this. I’ve also struggled with the SUV calculations in Slicer which would ideally be updated to work with more vendor formats. The QIBA wiki has been a useful resource.

With regards to the SUVmax differences you are seeing between Slicer and GE’s workstation, I can think of a few possibilities offhand: 1) error in formula/method (recheck, with reference to QIBA docs)?
2) are the SUV’s normalised in the same way? e.g., body weight vs lean body weight.
3) differences in the number of significant figures used by GE or Slicer when performing the calculations?
4) differences in how GE and Slicer treat peripheral voxels at the VOI margin (I think some programs include these voxels, others exclude, some may split values - the reference manual may specify which)? Having said that, SUVmax should be pretty robust across packages, since voxel with highest counts is rarely peripheral, so would check formulas and normalisation method as first steps and maybe check SUVmax results from a few additional software packages?

Good luck.

Hi Alex,

My version for sure works, because it has been validated with GE Workstation. How exactly slicer calculates I cannot tell. As I mentioned earlier, I could try to determine that (and/or try to fix it), but I stumbled into some issues (maybe more of a technical nature, regarding Slicer development: PET Standard Uptake Value Computation - #7 by mikbuch) – I would need help first with these issues, to try to validate/fix Slicer’s SUV calculator.

The image qimo601 posted in his question (the very beginning of the current post) is no longer available (link broken). Below I paste the image for future reference:


A new source: