Imported RT dose not converted from unsigned int to float

Operating system: Linux (OpenSUSE 15.4)
Slicer version: 5.2.1
Expected behavior: Scalar Type of imported RT dose should float
Actual behavior: Scalar Type of imported RT dose is unsigned int


When I import a radiation treatment plan produced by Varian Eclipse (Image, RTPLAN, RTSTRUCT, and RTDOSE. All in DICOM format.), then the RTDOSE file is of type float, and the Dose Volume Histogram (DVH) module (SlicerRT) works as expected. Then I create a child study and place an imported RT dose file in the child study tree. The RT dose has the same content as the one produced by Eclipse; only the Pixel Data and Dose Grid Scaling are taken from TOPAS simulations. In this case, however, the dose volume is not converted to float and rescaled. The conversion to RT Dose Volume does not change the data. The DVH module then generates histograms based on the unsigned int representation (max dose about 1E6 Gy).

Is this an expected behavior? Do I do something wrong?

As a workaround, I use the Cast Scalar Volume module to change unsigned int to float and the Dose Accumulation (SlicerRT) module to apply the Dose Grid Scaling factor. The dose volume then contains doses in Gy (max dose about 50 Gy), and the DVH module produces correct histograms. I get what I want, but the method is laborious.


Yes, this is the expected behavior. Scaling of the dose volume is performed during DICOM RT import. If you import the volume in some alternative way then you need to apply scaling yourself (it is a single-line operation using numpy - see examples in the script repository).

If you do this frequently then there are several options to choose from to make this import really simple, few-click operation:

  • Option A: create an RTDOSE file in your simulator
  • Option B: create a nrrd file with already scaled floating-point values (there should be no issue with directly storing these scaled values - probably RTDOSE uses integer values because at the time RTDOSE IOD was created, DICOM did not support float volumes; and they also saved some memory by using just 16 bits for each voxel)
  • Option C: create a custom file reader that recognizes your custom input file (nrrd file with some custom metadata to store the scaling value?) and applies the scaling and converts to dose volume