Advanced

User-defined infusions

User defined infusion are where the start time, dose and duration of an infusion are inputted. These can be used with or without target controlled infusions.

Warning

Using an user defined infusion alongside target controlled infusions may result in overshoot of the target

Example

import opentiva.pump as pump

p1 = pump.Pump(...)

p1.add_infusion(start=300, dose=0.042, duration=(60*60))

The above example adds an infusion starting at 5 minutes (300 seconds) at a dose of 0.042 mg / sec over 1 hour (3600 seconds) to give a total infused dose of 151 mg.

Parameter

Description

start

start time of infusion in seconds

dose

dose per second (e.g. mg / second) of infusion; unit as specified in model.concentration_unit

duration

total time of infusion in seconds

Note

Bolus doses can be considered as an infusion with a small duration e.g. dose 150 over duration 1 second

Decrement time

Decrement time is the time in seconds to reach a target from a start time if all infusions were stopped.

Example

import opentiva.pump as pump

p1 = pump.Pump(...)
p1.add_target(start=0, target=4, duration=10, effect=False)

decrement_time = p1.decrement_time(start=300, effect=False,
                                   target=1)

Parameter

Description

start

start time to calculate decrement time from in seconds

effect

true for effect site decrement time or false for plasma site decrement time

target

target concentration of plasma or effect concentration to decrement to

Note

Due to the exponential nature of the decrement time a concentration of 0 occurs at infinity. To avoid infinite loops a selected decrement target of 0 will approximate to 0.1.

Exporting data

Data can be exported by directly calling the Pump class object or by using a helper function:

Direct calling

target_concentrations

import opentiva.pump as pump

p1 = pump.Pump(...)

output = p1.target_concentrations

2d array of targets with each row containing:

  • start - start time of target in seconds

  • target - target of plasma or effect concentration

  • duration - time to achieve target level in seconds

  • effect - true for effect site targetting or false for plasma site targetting

  • cp_limit - multiplied to the target to get maximum increase in plasma concentration

  • cp_limit_duration - time to achieve cp_limit in seconds

  • ce_bolus_only - true will target the effect using the ‘original’ method / bolus only method

Note

In original effect site targetting after running generate_infusions() or run() functions the cp_limit for that target will be replaced with the calculated cp_limit value.

infusion_list

p1.generate_infusions()
output = p1.infusion_list

2d array of infusions calculated from provided targets and including any user defined infusions. With each row containing:

  • start time of infusion in seconds

  • dose of infusion over 1 second

  • duration of infusion in seconds

  • end time of infusion in seconds

user_infusion_list

output = p1.user_infusion_list

2d array of infusions entered by the user with each row containing:

  • start time of infusion in seconds

  • dose of infusion over 1 second

  • duration of infusion in seconds

  • end time of infusion in seconds

Helper functions

generate_rates_array

output = p1.generate_rates_array()

Turns the infusions from the infusion_list array into a ml/hr array; with each row containing:

  • time of rate change (seconds)

  • rate (ml/hr)

generate_dose_weight_array

output_min = p1.generate_dose_weight_array('min')
output_hr = p1.generate_dose_weight_array('hr')

Turns the infusions from the infusion_list array into dose/weight (if the infusion time is below the pump’s bolus time) or dose/weight/time array if not; with each row containing:

  • time of rate change (seconds);

  • bolus dose expressed as dose/weight (e.g. mg/kg) or dose/weight/time (e.g. mg/kg/hr);

  • true if bolus dose/weight (e.g. mg/kg) or false if infusion dose/weight/time (e.g. mg/kg/hr)

The time interval for dose/weight/time unit can be either:

  • min - str - for dose/weight/minute (default)

  • hr - str - for dose/weight/hour

generate_targets_array

output = p1.generate_targets_array()

Turns the target_concentrations array into a simple targets array with each row containing:

  • time of target change (seconds)

  • target concentration

Add new drug models

New drug models can be easily added but need to follow a default format. They should be a python class with the parameters and attributes shown in the minimal example. The full example is the recommeded format over the minimal.

For validation of the entered sex, age, weight and height the model should inherit the parent class from opentiva.model.

The class can then be imported to the pump.

Take a new module newdrug with model as class Model:

import opentiva.pump as pump
from . import newdrug

drug_model = newdrug.Model(sex=sex, age=age,
                           weight=weight, height=height)

p1 = pump.Pump(model=drug_model, drug_concentration=10,
               end_time=(60*60))

Minimal example

./drug.py

class MinimalModel():

    def __init__(self, sex: int, age: float, weight: float, height: float):
        self.weight = weight
        self.compartments = 3

        self.v1 = 14.3  # unit litres

        self.k10 = 0.0645  # unit /min
        self.k12 = 0.1086  # unit /min
        self.k13 = 0.0229  # unit /min
        self.k21 = 0.0245  # unit /min
        self.k31 = 0.0014  # unit /min
        self.ke0 = 0.17559  # unit /min

Full example

Annotated example of the propofol marsh diprifusor model.

import opentiva.model as Model
  # parent class to validate class instance variables
import opentiva.validation as validation
  # functions to validate anthopometric values


   class MarshDiprifusor(Model):
       """MarshDiprifusor class holds pharmacokinetic parameters for the
          Diprifusor Marsh propofol model with Keo 0.26.
          Reference: PMID: 1859758 DOI: 10.1093/bja/67.1.41
       """

       def __init__(self, sex: int, age: float, weight: float, height: float):
           super().__init__(sex, age, weight, height)

           # sex : 0 for male or 1 for female
           # age : in years
           # weight : in kg
           # height : in cm

           self.compartments = 3
             # number of compartments to model; either 2 or 3
           self.concentration_unit = "mg/ml"
             # drug concentration unit
           self.target_unit = "ug/ml"
             # target concentration unit
           self.age_lower = 16
             # lower age limit of model; -1 if no limit
           self.age_upper = -1
             # upper age limit of model; -1 if no limit
           self.weight_lower = -1
             # lower weight limit of model; -1 if no limit
           self.weight_upper = 150
             # upper weight limit of model; -1 if no limit
           self.pmid = "1859758"
             # pubmed ID of model's reference
           self.doi = "10.1093/bja/67.1.41"
             # digital Object Identifier (DOI) of model's reference
           self.validate_anthropometric_values()
             # Funtion imported from the parent Model class and validates
             # the input age and weight is between the specified values of
             # the model. If not a warning is appended to the self.warning
             # string and to sys.stderr.

           self.v1 = 0.228 * weight
             # volume of central compartment in litres
           self.v2 = 0.463 * weight
             # volume of fast compartment in litres
           self.v3 = 2.893 * weight
             # volume of slow compartment in litres

   #       self.cl1 =
             # clearence of compartment 1 in litres/min
   #       self.cl2 =
             # clearence of compartment 2 in litres/min
   #       self.cl3 =
             # clearence of compartment 3 in litres/min

           self.k10 = 0.119
             # equilibrium rate constant from compartment 1 to 0 /min
             # also = self.cl1 / self.v1
           self.k12 = 0.112
             # equilibrium rate constant from compartment 1 to 2 /min
             # also = self.cl2 / self.v1
           self.k13 = 0.0419
             # equilibrium rate constant from compartment 1 to 3 /min
             # also = self.cl3 / self.v1
           self.k21 = 0.055
             # equilibrium rate constant from compartment 2 to 1 /min
             # also = self.cl2 / self.v2
           self.k31 = 0.0033
             # equilibrium rate constant from compartment 3 to 1 /min
             # also = self.cl3 / self.v3
           self.ke0 = 0.26
             # effect compartment equilibrium rate constant /min

   #       self.k20 =
             # equilibrium rate constant from compartment 2 to 0 /min
             # optional parameter for two compartment modelling

Deriving Ke0

Ke0 can be derived from a PKPD model using the \(t_{peak}\) method. Using a preexisiting model or a new model (if using a new model and ke0 is unknown then self.ke0 must still be declared within the module e.g. self.ke0 = 0)

Details of the theory surrounding this can be found here.

import opentiva.propofol as propofol
import opentica.pkpd as pkpd

sex = 0  # male
age = 30  # years
weight = 70  # kg
height = 170  # cm

propofol_marsh = propofol.MarshDiprifusor(sex=sex, age=age,
                                          weight=weight,
                                          height=height)

pkpd_model = pkpd.PkPdModel(propofol_marsh)

dose = 1 # bolus dose in mg
tpeak = 236 # time to peak effect site concentration in seconds
ce_tpeak = 0.25831 # effect site concentration at tpeak

ke0 = pkpd_model.ke0_tpeak_method(dose=dose, tpeak=tpeak,
                                  ce_tpeak=ce_tpeak)

Parameter

Description

dose

total bolus dose of drug given at time 0 over 1 second

tpeak

time in seconds of peak effect

ce_tpeak

effect site concentration at tpeak

Note

ke0_tpeak_method returns the ke0 as /seconds.