Source code for pytrip.let

#
#    Copyright (C) 2010-2017 PyTRiP98 Developers.
#
#    This file is part of PyTRiP98.
#
#    PyTRiP98 is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    PyTRiP98 is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with PyTRiP98.  If not, see <http://www.gnu.org/licenses/>.
#
"""
This module provides the LETCube for handling LET data.
"""
import numpy as np
from pytrip.cube import Cube
import pytriplib


[docs]class LETCube(Cube): """ This class handles LETCubes. It is similar to DosCubes and CtxCubes, but is intended to hold LET data. The object has build-in methods to read and write the LET data cubes, calculate the LET-volume historgrams, and write these to disk. It is inherited from Cube, which contains many additional methods and attributes. """ data_file_extension = ".dosemlet.dos" header_file_extension = ".dosemlet.hed" def __init__(self, cube=None): super(LETCube, self).__init__(cube)
[docs] def write(self, path): """Write the LETCube and its header to a file with the filename 'path'. :param str path: path to header file, data file or basename (without extension) """ header_file, let_file = self.parse_path(path_name=path) self._write_trip_header(header_file) self._write_trip_data(let_file)
[docs] def get_max(self): """ Returns the largest value in the LETCube. :returns: the largets value found in the in the LETCube. """ return np.amax(self.cube)
[docs] def calculate_lvh(self, voi): """ Calculate a LET-volume historgram. :param Voi voi: The volume of interest, in the form of a Voi object. :returns: A tuple containing - lvh: the LET-volume histogram - min_lvh: array of LET values below 2% - max_lvh: array of LET values above 98% - area: TODO - what is this? """ pos = 0 size = np.array([self.pixel_size, self.pixel_size, self.slice_distance]) lv = np.zeros(3000) for i in range(self.dimz): pos += self.slice_distance slice = voi.get_slice_at_pos(pos) if slice is not None: lv += pytriplib.calculate_lvh_slice(self.cube[i], np.array(slice.contour[0].contour), size) cubes = sum(lv) lvh = np.cumsum(lv[::-1])[::-1] / cubes min_let = np.where(lvh >= 0.98)[0][-1] max_let = np.where(lvh <= 0.02)[0][0] area = cubes * size[0] * size[1] * size[2] / 1000 mean = np.dot(lv, range(0, 3000)) / cubes return lvh, min_let, max_let, mean, area
[docs] def write_lvh_to_file(self, voi, path): """ Write the LET-volume historgram to a file. :param Voi voi: The volume of interest, n the form of a Voi object. :param str path: Full path of file to be written. """ lvh, _, _, _, _ = self.calculate_lvh(voi) print(lvh.shape) output = "" # TODO fix following line # lvh has shape (3000,0) and contains only let, not vol # see calculate_lvh() method for vol, let in zip(lvh[0], lvh[1]): output += "%.4e\t%.4e\n" % (vol, let) f = open(path + ".dvh", "w+") f.write(output) f.close()