Skip to content

PK Model

A two-compartment model for doxycycline administration within a given time interval.

\[\begin{align} I(t) &= \begin{cases} f_{intake} \frac{F_{Dox} C_{DH}}{V_D} && \tau_{0} < t< \tau_{1} \tag{1}\\ 0 \end{cases} \\ \dot{[Dox_{P}]} &= k_{a_{Dox}}I(t) -k_{el_{Dox}}[Dox_{P}] - k_{PB_{Dox}}[Dox_{P}] + k_{BP_{Dox}}[Dox_{B}] \tag{2}\\ \dot{[Dox_{B}]} &= k_{PB_{Dox}}[Dox_{P}] - k_{BP_{Dox}}[Dox_{B}] \tag{3} \end{align} \]

See DoxPKConfig for parameter details.

rma_kinetics.models.DoxPK

Dox PK model for tet-induced and chemogenetic RMA models.

Attributes:

Name Type Description
config DoxPKConfig

Model configuration.

Source code in src/rma_kinetics/models/dox.py
class DoxPK(EqxModule):
    """
    Dox PK model for tet-induced and chemogenetic RMA models.

    Attributes:
        config (DoxPKConfig): Model configuration.
    """
    config: DoxPKConfig

    def __getattr__(self, name):
        if hasattr(self.config, name):
            return getattr(self.config, name)

        raise AttributeError(name)


    def _intake(self, t: float) -> float:
        """
        Time dependent dox intake.

        Arguments:
            t (float): Time point.

        Returns:
            intake_rate (float): Time-dependent dox intake rate.
        """

        return jax_cond(
            jnp.logical_and(t >= self.t0, t < self.t1),
            lambda: self.intake_rate,
            lambda: 0.0
        )

    def _model(self, t: float, y: PyTree[float], args=None) -> PyTree[float]:
        """
        Two compartment dox kinetic model.

        Arguments:
            t (float): time point.
            y (PyTree[float]): Plasma and brain dox amounts.

        Returns:
            dydt (PyTree[float]): Change in plasma and brain dox concentrations.
        """

        plasma_dox, brain_dox = y
        plasma_outflux = self.brain_transport_rate * plasma_dox
        brain_outflux = self.plasma_transport_rate * brain_dox
        dplasma_dox = (self.absorption_rate * self._intake(t)) - (self.elimination_rate * plasma_dox) - plasma_outflux + brain_outflux
        dbrain_dox =  plasma_outflux - brain_outflux

        return dplasma_dox, dbrain_dox

_intake(t: float) -> float

Time dependent dox intake.

Parameters:

Name Type Description Default
t float

Time point.

required

Returns:

Name Type Description
intake_rate float

Time-dependent dox intake rate.

Source code in src/rma_kinetics/models/dox.py
def _intake(self, t: float) -> float:
    """
    Time dependent dox intake.

    Arguments:
        t (float): Time point.

    Returns:
        intake_rate (float): Time-dependent dox intake rate.
    """

    return jax_cond(
        jnp.logical_and(t >= self.t0, t < self.t1),
        lambda: self.intake_rate,
        lambda: 0.0
    )

_model(t: float, y: PyTree[float], args=None) -> PyTree[float]

Two compartment dox kinetic model.

Parameters:

Name Type Description Default
t float

time point.

required
y PyTree[float]

Plasma and brain dox amounts.

required

Returns:

Name Type Description
dydt PyTree[float]

Change in plasma and brain dox concentrations.

Source code in src/rma_kinetics/models/dox.py
def _model(self, t: float, y: PyTree[float], args=None) -> PyTree[float]:
    """
    Two compartment dox kinetic model.

    Arguments:
        t (float): time point.
        y (PyTree[float]): Plasma and brain dox amounts.

    Returns:
        dydt (PyTree[float]): Change in plasma and brain dox concentrations.
    """

    plasma_dox, brain_dox = y
    plasma_outflux = self.brain_transport_rate * plasma_dox
    brain_outflux = self.plasma_transport_rate * brain_dox
    dplasma_dox = (self.absorption_rate * self._intake(t)) - (self.elimination_rate * plasma_dox) - plasma_outflux + brain_outflux
    dbrain_dox =  plasma_outflux - brain_outflux

    return dplasma_dox, dbrain_dox