Source code for pytrip.models.rcr

#
#    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/>.
#
"""
The RCR model is based on the paper from Antonovic et al.
https://doi.org/10.1093/jrr/rru020
Parameters are set for C-12 ions only.
"""

import numpy as np
import logging

logger = logging.getLogger(__name__)


[docs]def rbe_rcr(dose_ion, let, alpha_x, beta_x, oxy=None): """ Returns the RBE for a given dose/let cube. input parameters may be either numpy.array or scalars TODO: handle real cubes. :params dose_ion: ion physical dose in [Gy] :params let: LET in [keV/um] :params alpha_x: alpha for X-rays in [Gy^-1] :params beta_x: beta for X-rays in [Gy^-2] :params oxy: optional oxygenation cube in [mmHgO_2] """ # Calculate sf_ion(D_ion, let, oxy) # from pytrip.models.extra import rbe_from_sf # rbe_from_sf(_sf, dose_ion, alpha_x, beta_x) logger.warning("rcr_rbe not implemented yet.") pass # TODO: not implemented yet.
[docs]def sf_rcr(dose, let, oxy=None): """ Function which returns surving fraction Equation (3) in https://doi.org/10.1093/jrr/rru020 input parameters may be either numpy.array or scalars TODO: handle real cubes. :params dose: physical ion dose in [Gy] :params let: LET in keV/um :params oxy: optional oxygenation in [mmHgO_2] """ a0 = 5.7 a1 = 1.3 b1 = 2.0 c0 = 5.7 c1 = 0.2 ln = 423.0 if oxy is None: ocube = 1.0 else: ocube = oer_po2_rcr(let, oxy) # ocube = oer_rcr(let) # TODO: this was old version, not sure how to include. a = (a0 * _f(let) + a1 * np.exp(-let/ln)) / ocube b = b1 * np.exp(-let/ln) / ocube c = (c0 * _f(let) + c1 * np.exp(-let/ln)) / ocube sf = np.exp(-dose * a) + dose * b * np.exp(-dose * c) return sf
def _f(let): """ f function from Dasu paper, takes let-cube as parameter Equation (7) in https://doi.org/10.1093/jrr/rru020 input parameters may be either numpy.array or scalars TODO: handle real cubes. :params let: LET in [keV/um] :returns: result of the f function """ ld = 86.0 result = (1 - np.exp(-let/ld) * (1 + let/ld)) * ld/let # map any zero LET areas to 0.0 if np.isscalar(result): # scalar if result == np.inf: result = 0.0 else: result[result == np.inf] = 0.0 # numpy arrays return result
[docs]def oer_rcr(let): """ ~O dose modifying factor. Equation (2) in https://doi.org/10.1093/jrr/rru020 input parameters may be either numpy.array or scalars TODO: handle real cubes. :params let: LET in [keV/um] :returns: cube containing the oxygen enhancement ratio """ omin = 1.10 omax = 2.92 lo = 114.0 _o = omin + (omax - omin) * np.exp(-(let/lo)*(let/lo)) return _o
[docs]def oer_po2_rcr(let, oxy): """ ~O dose modifying factor, taking varying pO2 into account Equation (1) in https://doi.org/10.1093/jrr/rru020 input parameters may be either numpy.array or scalars TODO: handle real cubes. :params let: LET in [keV/um] :params oxy: oxygenation in [mmHgO_2] :returns: cube containing the oxygen enhancement ratio """ k = 2.5 # mmHg _o = oer_rcr(let) * (k + oer_rcr(let)) / (k + oer_rcr(let) * oxy) return _o