R/LifecoursePhysiology.R

# Small utility function for linear interpolation
# Used internally
interp2 <- function(x1, x2, y1, y2, x)
{
  m = (y2 - y1)/(x2 - x1)
  y = y1 + m*(x - x1)
  return(y)
}

#' Get volumes for tissues provided on the basis of age and gender
#'
#' @param age Age of the organism in years
#' @param gender The gender of the organism "M" for Male or "F" for Female
#' @param perf_frct fraction of perfused tissue. default to 0.85 
#' @param tissues List of tissues for which the volumes are needed. The tissues can be one of the following
#' liver,
#' blood,
#' fat,
#' bone,
#' brain,
#' gonad,
#' heart,
#' intestine,
#' kidney,
#' lung,
#' pancreas,
#' skin,
#' spleen,
#' stomach,
#' thymus,
#' remaining,
#' muscle
#' @return
#' list containing volumes for age, gender and tissues.
#' @export
#'
getLifecourseTissueVolumes<- function(age = 25, gender = "M",perf_frct = 0.85,
                                      tissues=list()){
  tissue_vol_list <- NULL
  available_tissues <- c("blood","fat","skin","muscle","bone","brain","lung",
                         "heart","gi","kidney","liver","rpf","spf")
  spf_tissues <- c("fat","skin","muscle","bone")
  rpf_tissues <- available_tissues[!(available_tissues %in% c(spf_tissues,"rpf","spf"))]
  inactive_tissues <- dplyr::setdiff(available_tissues,tissues)
  rpf_inactive_tissues <- inactive_tissues[inactive_tissues %in% rpf_tissues]
  spf_inactive_tissues <- inactive_tissues[inactive_tissues %in% spf_tissues]

  if(is.na(age)) return

  tissue_vol_list[["gi"]]<-getLifecourseGutVolume(age,gender)
  tissue_vol_list[["liver"]]<-getLifecourseLiverVolume(age,gender)
  tissue_vol_list[["blood"]]<-getLifecourseBloodVolume(age,gender)
  tissue_vol_list[["fat"]]<-getLifecourseAdiposeVolume(age,gender)
  tissue_vol_list[["bone"]]<-getLifecourseBoneVolume(age,gender)
  tissue_vol_list[["brain"]]<-getLifecourseBrainVolume(age,gender)
  tissue_vol_list[["heart"]]<-getLifecourseHeartVolume(age,gender)
  tissue_vol_list[["kidney"]]<-getLifecourseKidneyVolume(age,gender)
  tissue_vol_list[["lung"]]<-getLifecourseLungVolume(age,gender)
  tissue_vol_list[["skin"]]<-getLifecourseSkinVolume(age,gender)
  tissue_vol_list[["muscle"]]<-getLifecourseMuscleVolume(age,gender)
  # for richly perfused get value
  #from equation and add inactive tissue volumes
  vol <- getLifecourseRapidlyPerfusedVolume(age,gender)
  rpf_inact_vol <- sum(tissue_vol_list[rpf_inactive_tissues])
  tissue_vol_list[["rpf"]]<-vol+rpf_inact_vol

  # for slowly perfused get value
  #from equation and add inactive tissue volumes
  vol <- getLifecourseSlowlyPerfusedVolume(age,gender,perf_frct)
  spf_inact_vol <- sum(tissue_vol_list[spf_inactive_tissues])
  tissue_vol_list[["spf"]]<-vol+spf_inact_vol

  #print(tissue_vol_list[tissues])
  return(tissue_vol_list[tissues])

}

#' Get perfusion for tissues provided on the basis of age and gender
#'
#' @param age Age of the organism in years
#' @param gender The gender of the organism "M" for Male or "F" for Female
#' @param source source of the equation. defaults to "sciv" for scitovation
#' @param tissues List of tissues for which blood perfusion is needed. The
#'   tissues can be any of the following
#'   liver,
#'   fat,
#'   bone,
#'   brain,
#'   gonad,
#'   heart,
#'   intestine,
#'   kidney,
#'   lung,
#'   pancreas,
#'   skin,
#'   spleen,
#'   stomach,
#'   thymus,
#'   muscle,
#'   remaining.
#'  
#' @return list containing blood perfusion of tissues for the given age and
#' gender.
#' @export
getLifecourseTissuePerfusion<- function(age = 25, gender = "M", tissues = list(),source = "sciv"){

  if(is.na(age)) return(NA)
  if (source == "sciv"){
    #get scaling factor for cardiac output calculated as sum(qc) or from SCIV equation
    qc_scaling <- 1
  }else{
    qc_scaling <- 1.164749
  }


  tissue_perf_list <- NULL
  available_tissues <- c("fat","skin","muscle","bone","brain","lung",
                         "heart","gi","kidney","liver","rpf","spf")
  spf_tissues <- c("fat","skin","muscle")
  rpf_tissues <- available_tissues[!(available_tissues %in% c(spf_tissues,"rpf","spf"))]
  inactive_tissues <- dplyr::setdiff(available_tissues,tissues)
  rpf_inactive_tissues <- inactive_tissues[inactive_tissues %in% rpf_tissues]
  spf_inactive_tissues <- inactive_tissues[inactive_tissues %in% spf_tissues]

  if ("gi" %in% tissues){

    tissue_perf_list[["gi"]] <- (getLifecourseGutPerfusion(age,gender)) * qc_scaling
    tissue_perf_list[["liver_art"]]<- getLifecourseLiverArterialPerfusion(age,gender) * qc_scaling
    tissue_perf_list[["liver_ven"]]<- (tissue_perf_list[["liver_art"]] +
                                         tissue_perf_list[["gi"]])
  }else{
    tissue_perf_list[["liver_art"]]<- (getLifecourseLiverArterialPerfusion(age,gender)+
                                         getLifecourseGutPerfusion(age,gender)) * qc_scaling
    tissue_perf_list[["liver_ven"]]<- tissue_perf_list[["liver_art"]]
  }

  if (!("liver" %in% tissues)){
    rpf_inactive_tissues <- c(inactive_tissues,"liver")
    tissue_perf_list[["liver"]]<- getLifecourseLiverArterialPerfusion(age,gender)* qc_scaling
  }

  tissue_perf_list[["fat"]]<- getLifecourseAdiposePerfusion(age,gender)* qc_scaling
  tissue_perf_list[["bone"]]<- getLifecourseBonePerfusion(age,gender)* qc_scaling
  tissue_perf_list[["brain"]]<-getLifecourseBrainPerfusion(age,gender)* qc_scaling
  # tissue_perf_list[["gonad"]]<- getLifecourseGonadPerfusion(age,gender)* qc_scaling
  tissue_perf_list[["heart"]]<- getLifecourseHeartPerfusion(age,gender)* qc_scaling
  tissue_perf_list[["kidney"]]<-getLifecourseKidneyPerfusion(age,gender)* qc_scaling
  tissue_perf_list[["lung"]]<- getLifecourseLungPerfusion(age,gender)* qc_scaling
  # tissue_perf_list[["pancreas"]]<- getLifecoursePancreasPerfusion(age,gender)* qc_scaling
  tissue_perf_list[["skin"]]<- getLifecourseSkinPerfusion(age,gender)* qc_scaling
  # tissue_perf_list[["spleen"]]<- getLifecourseSpleenPerfusion(age,gender)* qc_scaling
  # tissue_perf_list[["thymus"]]<- getLifecourseThymusPerfusion(age,gender)* qc_scaling
  tissue_perf_list[["muscle"]]<- getLifecourseMusclePerfusion(age,gender)* qc_scaling

  # for rapidly perfused tissue flow
  rpf_perf <-  getLifecourseRichlyPerfusedTissuePerfusion(age,gender)* qc_scaling
  inact_perf <- sum(tissue_perf_list[rpf_inactive_tissues])
  tissue_perf_list[["rpf"]]<- rpf_perf+inact_perf
  # for slowly perfused tissue flow
  spf_perf <-  getLifecourseSlowlyPerfusedTissuePerfusion(age,gender)* qc_scaling
  inact_perf <- sum(tissue_perf_list[spf_inactive_tissues])
  tissue_perf_list[["spf"]]<- spf_perf+inact_perf

  if("liver" %in% tissues){
    tissues <- tissues[tissues != "liver"]
    tissues <- c(tissues,"liver_art","liver_ven")

  }
  return(tissue_perf_list[tissues])

}

#' Get average body weight using the life course equation
#' @description The function is used to calculate the average body weight in kgs for humans based on age and gender.
#'  The function uses life course equations developed by Scitovation.
#' @param age age in years
#' @param gender Either "M" for male or "F" for female
#' @return Body Weight in kgs
#' @export
getLifecourseBodyWeight <- function(age, gender){
  if(is.na(age)) return(NA)
  if(gender == "M") {
    return(getLifecourseBodyWeightMale(age))
  }else if(gender == "F") {
    return(getLifecourseBodyWeightFemale(age))
  }
}

#' Calculate body weight in kg of average human male using the lifecourse
#' equation
#' @description This function is not called directly by the user. See
#'   \code{getLifeCourseBodyWeight}
#' @param age age in years
#' @return Body weight in kg
getLifecourseBodyWeightMale <- function(age){
  mwbirth = 4
  mwchild = 28
  mwadult = 56
  half = 6
  k = 70
  theta = 14.85
  diff_bh_bw = -1.46
  mbw25 = 81.208

  wa = diff_bh_bw + theta
  lambda = log(k**2) / (2.0 * wa * mwadult)

  bw = NA

  if(age >= 0 && age < 26) {
    bw = mwbirth + (mwchild*age)/(half + age) + (mwadult/(1.0 + k*exp(-lambda*mwadult*age)))
  }else if(age >= 26) {
    months = age*12
    bw = ((2.19e-08 * months**3.0) - (1.22e-04 * months**2.0) + (0.120*months) + 50.824)*mbw25/76.6
  }

  return(bw)
}

#' Calculate body weight in kg of average human female using the lifecourse
#' equation
#' @description This function is not called directly by the user. See
#' \code{getLifeCourseBodyWeight}
#' @param age age in years
#' @return Body weight in kg
getLifecourseBodyWeightFemale <- function(age){
  mwbirth = 3.4
  mwchild = 22
  mwadult = 42.854
  wadult = 42.668
  half = 3
  mbwadult = 65.236
  k = 142
  lambda = 0.010279
  theta = 11.5
  h1 = 163

  bw = NA

  if(age >= 0 && age < 22.3333) {
    bw = 3.4 +(mwchild*age)/(3.0 + age) + (mwadult/(1.0 + 142.11536*exp(-0.01028*mwadult*age)))
  }else if(age >= 22.3333) {
    months = age*12
    bw = ((6.17*10^-09*months^3)-(9.68*10^-5*months^2)+(0.109*months)+43.790)*mbwadult/66.17
  }

  return(bw)
}

#' Get average body height using the life course equation
#' @description The function is used to calculate the average body height for humans based on age and gender.
#'  The function uses life course equations developed by Scitovation.
#' @param age age in years
#' @param gender Either "M" for male or "F" for female
#' @return Body Height
#' @export
getLifecourseBodyHeight <- function(age, gender){
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseBodyHeightMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseBodyHeightFemale(age))
  }
}

#' Calculate body height of average human male using the lifecourse
#' equation
#' @description This function is not called directly by the user.
#' @param age age in years
#' @return Body height
getLifecourseBodyHeightMale <- function(age){
  if(is.na(age)) return(NA)

  h1 = 177
  theta = 14.85
  s0 = 0.135
  s1 = 1.5
  c1 = 0.9
  d1 = 0.5
  mht = 168.6
  mbht3 = h1 - 2.0*(h1 - mht)/(exp(s0*(age - theta)) + exp(s1*(age - theta)))
  mbhtj3 = h1*(1.0 - 1.0/(1.0 + ((age + 0.75)/d1)^c1))

  bh = NA

  if(age >= 0 && age < 3) {
    bh = h1*(1.0 - 1.0/(1.0 + ((age + 0.75)/d1)^c1))*mbht3/mbhtj3
  } else if(age >= 3) {
    bh = 177.0 - 2.0*(177.0 - mht)/(exp(s0*(age - theta)) + exp(s1*(age - theta)))
  }

  return(bh)
}

#====================================================================================================
getLifecourseBodyHeightFemale <- function(age)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  h1 = 162.15
  theta = 11.2536
  s0 = 0.135
  s1 = 1.27
  mht = 151
  mbht = 94.2
  mbhtj = 94.81

  bh = NA

  if(age >= 0 && age <= 3) {
    bh = h1*(1 - 1/(1 + ((age + 0.75)/2.3)^0.7))*mbht/mbhtj
  } else if(age >= 3) {
    bh = h1 - 2*(h1 - mht)/(exp(s0*(age - theta)) + exp(s1*(age - theta)))
  }

  return(bh)
}

#====================================================================================================
getLifecourseBodySurfaceArea <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseBodySurfaceAreaMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseBodySurfaceAreaFemale(age))
  }
}

#====================================================================================================
getLifecourseBodySurfaceAreaMale <- function(age)
  #====================================================================================================
{
  mbw = getLifecourseBodyWeightMale(age)
  mbh = getLifecourseBodyHeightMale(age)

  bsa = exp(-3.751 + 0.422*log(mbh) + 0.515*log(mbw))

  return(bsa)
}

#====================================================================================================
getLifecourseBodySurfaceAreaFemale <- function(age)
  #====================================================================================================
{
  mbw = getLifecourseBodyWeightFemale(age)
  mbh = getLifecourseBodyHeightFemale(age)

  bsa = exp(-3.751 + 0.422*log(mbh) + 0.515*log(mbw))

  return(bsa)
}

#====================================================================================================
getLifecourseBodyMassIndex <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseBodyMassIndexMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseBodyMassIndexFemale(age))
  }
}

#====================================================================================================
getLifecourseBodyMassIndexMale <- function(age)
  #====================================================================================================
{
  mbw = getLifecourseBodyWeightMale(age)
  mbh = getLifecourseBodyHeightMale(age)

  bmi = mbw/((mbh/100)**2)

  return(bmi)
}

#====================================================================================================
getLifecourseBodyMassIndexFemale <- function(age)
  #====================================================================================================
{
  mbw = getLifecourseBodyWeightFemale(age)
  mbh = getLifecourseBodyHeightFemale(age)

  bmi = mbw/((mbh/100)**2)

  return(bmi)
}

#====================================================================================================
getLifecourseHematocrit <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseHematocritMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseHematocritFemale(age))
  }
}

#====================================================================================================
getLifecourseHematocritMale <- function(age)
  #====================================================================================================
{
  hct = NA;

  if(age >= 0 && age < 2) {
    hct = 0.359
  } else if(age >= 2) {
    hct = (((1.12815e-06)*(age**3.0)) - (1.72362e-04*(age**2.0)) + (8.15264e-03*age) + 0.327363)
  }

  return(hct)
}

#====================================================================================================
getLifecourseHematocritFemale <- function(age)
  #====================================================================================================
{
  hct = NA;

  # Note: this is same as male equation
  if(age >= 0 && age < 2) {
    hct = 0.359
  } else if(age >= 2) {
    hct = (((1.12815e-06)*(age**3.0)) - (1.72362e-04*(age**2.0)) + (8.15264e-03*age) + 0.327363)
  }

  return(hct)
}

#====================================================================================================
getLifecourseBloodVolume <- function(age, gender, source = "sciv")
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if (source == "bosgra"){
    if(gender == "M") {
      return(getLifecourseBloodVolumeMale(age))
    }
    else if(gender == "F") {
      return(getLifecourseBloodVolumeFemale(age))
    }
  }else if(source == "sciv"){
    if(gender == "M") {
      return(getLifecourseBloodVolumeMaleSciV(age))
    }
    else if(gender == "F") {
      return(getLifecourseBloodVolumeFemaleSciV(age))
    }
  }


}

#====================================================================================================
getLifecourseBloodVolumeMale <- function(age)
  #====================================================================================================
{
  bsa = getLifecourseBodySurfaceAreaMale(age)
  vblood = 3.33*bsa - 0.81

  return(vblood)
}

getLifecourseBloodVolumeMaleSciV<- function(age){
  mbsa <- getLifecourseBodySurfaceAreaMale(age)
  hct <- getLifecourseHematocritMale(age)
  bw <- getLifecourseBodyWeightMale(age)
  #constants:
  a <- 10.0
  b <- 1.2082
  c <- 3.2869
  d <- 0.0
  e <- 1000.0
  vpls <-  (a^(b *log10(mbsa) + c)) * (1 + d) * ((1 - hct) / e)
  vbldc <- (vpls/bw)/(1-hct)
  vblood <- vbldc*bw
  return(vblood)
}

getLifecourseBloodVolumeFemaleSciV<- function(age){
  mbsa <- getLifecourseBodySurfaceAreaFemale(age)
  hct <- getLifecourseHematocritFemale(age)
  bw <- getLifecourseBodyWeightFemale(age)
  #constants:
  a <- 10.0
  b <- 1.2082
  c <- 3.2869
  e <- 1000.0
  #equations
  vpls <-  (a^(b *log10(mbsa) + c)) *((1 - hct) / e)
  vbldc <- (vpls/bw)/(1-hct)
  vblood <- vbldc*bw
  return(vblood)
}

#====================================================================================================
getLifecourseBloodVolumeFemale <- function(age)
  #====================================================================================================
{
  bsa = getLifecourseBodySurfaceAreaFemale(age)
  vblood = 2.66*bsa - 0.46

  return(vblood)
}

#====================================================================================================
getLifecourseAdiposeVolume <- function(age, gender, source = "sciv")
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(source=="bosgra"){
    if(gender == "M") {
      return(getLifecourseAdiposeVolumeMaleSciV(age))
    }
    else if(gender == "F") {
      return(getLifecourseAdiposeVolumeFemaleSciV(age))
    }
  }else if(source == "sciv"){
    if(gender == "M") {
      return(getLifecourseAdiposeVolumeMaleSciV(age))
    }
    else if(gender == "F") {
      return(getLifecourseAdiposeVolumeFemaleSciV(age))
    }
  }


}

#====================================================================================================
getLifecourseAdiposeVolumeMaleSciV <- function(age)
  #====================================================================================================
{
  vadipose = NA

  # Note, these are not the Bosgra equations.  Those eqns apparently have some errors,
  # so I'm using the Scitovation eqns here.
  mbw25 = 81.21
  mbmi25 = 25.92
  mbmi20 = 24.07

  bw = getLifecourseBodyWeightMale(age)
  bmi = getLifecourseBodyMassIndexMale(age)

  mvfatadult = 18.02
  mperfat20a = 22
  mperfat20b =  23.1

  if(age >= 0 && age < 20) {
    vadipose = bw*((2.9875*exp(-0.129*age) + 0.67)*bmi + 0.2635*age - 4.843)/100.0
  }
  else if(age >= 20) {
    vadipose = bw*(-5.33798*bmi + 0.11149*(bmi**2.0) + 0.09795*age + 85.24521)*(mperfat20a/mperfat20b)/100.0
  }

  return(vadipose)
}

#====================================================================================================
getLifecourseAdiposeVolumeFemaleSciV <- function(age)
  #====================================================================================================
{
  vadipose = NA

  # Note, these are not the Bosgra equations.  Those eqns apparently have some errors,
  # so I'm using the Scitovation eqns here.
  mbw25 = 81.21
  mbmi25 = 25.92
  mbmi20 = 24.07

  bw = getLifecourseBodyWeightFemale(age)
  bmi = getLifecourseBodyMassIndexFemale(age)

  mvfatadult = 24.15
  mperfat25a = 36.51
  mperfat25b =  37.32

  if(age >= 0 && age < 25) {
    vadipose = bw*((1.5334*exp(-0.103*age) + 0.67)*bmi + 0.6276*age + 1.0301)/100.0

  }
  else if(age >= 25) {
    vadipose = bw*(1.9224*bmi - 0.018517*(bmi**2.0) + 0.05537*age - 0.794894)*(mperfat25a/mperfat25b)/100.0

  }

  return(vadipose)
}


#====================================================================================================
getLifecourseBoneVolume <- function(age, gender, source = "sciv")
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if (source == "Bosgra"){
    if(gender == "M") {
      return(getLifecourseBoneVolumeMale(age))
    }
    else if(gender == "F") {
      return(getLifecourseBoneVolumeFemale(age))
    }
  }else if (source == "sciv"){
    if(gender == "M") {
      return(getLifecourseBoneVolumeMaleSciV(age))
    }
    else if(gender == "F") {
      return(getLifecourseBoneVolumeFemaleSciV(age))
    }
  }

}

#====================================================================================================
getLifecourseBoneVolumeMale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightMale(age)
  vbone = exp(0.0689)*((h/100)**2.67)
  return(vbone)
}

#====================================================================================================
getLifecourseBoneVolumeFemale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightFemale(age)
  vbone = exp(0.0689)*((h/100)**2.67)
  return(vbone)
}


getLifecourseBoneVolumeMaleSciV<- function(age){
  # calculated using linear interpolation
  x <- c(0,1,5,10,15,25)
  y <- c(0.05,0.15,0.34,0.63,1.08,1.17)
  vals <- approx(x,y,age,"linear",rule = 2)
  return(vals$y)
}

getLifecourseBoneVolumeFemaleSciV<- function(age){
  # calculated using linear interpolation
  x <- c(0,1,5,10,15,25)
  y <- c(0.5,0.15,0.34,0.63,1,0.9)
  vals <- approx(x,y,age,"linear",rule = 2)
  return(vals$y)
}

#====================================================================================================
getLifecourseBrainVolume <- function(age, gender, source = "sciv")
#====================================================================================================
{
  if(is.na(age)) return(NA)

  if(source=="bosgra"){
    if(gender == "M") {
      return(getLifecourseBrainVolumeMale(age))
    }
    else if(gender == "F") {
      return(getLifecourseBrainVolumeFemale(age))
    }
  }else if(source=="sciv"){
    if(gender == "M") {
      return(getLifecourseBrainVolumeMaleSciV(age))
    }
    else if(gender == "F") {
      return(getLifecourseBrainVolumeFemaleSciV(age))
    }
  }

}

#====================================================================================================
getLifecourseBrainVolumeMale <- function(age)
  #====================================================================================================
{
  v0 = 0.405
  vbrain = v0*(3.68 - 2.68*exp(-age/0.89))*(exp(-age/629))
  return(vbrain)
}

#====================================================================================================
getLifecourseBrainVolumeFemale <- function(age)
  #====================================================================================================
{
  v0 = 0.373
  vbrain = v0*(3.68 - 2.68*exp(-age/0.89))*(exp(-age/629))
  return(vbrain)
}

getLifecourseBrainVolumeMaleSciV <- function(age){
  #constants
  a <- 10.0
  b <- 0.315
  c <- 9.0
  d <- 6.92
  vbrain <- a*(age+b)/(c+d*age)
  return(vbrain)
}

getLifecourseBrainVolumeFemaleSciV <- function(age){
  #constants
  a <- 10.0
  b <- 0.315
  c <- 9.0
  d <- 6.92
  vbrain <- a*(age+b)/(c+d*age)
  return(vbrain)
}

#====================================================================================================
getLifecourseGonadVolume <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseGonadVolumeMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseGonadVolumeFemale(age))
  }
}
#====================================================================================================
getLifecourseGonadVolumeMale <- function(age)
  #====================================================================================================
{
  vgon = (3.3 + 53*(1 - exp(-(age/17.5)**5.4)))/1000 # Convert to kg
  return(vgon)
}

#====================================================================================================
getLifecourseGonadVolumeFemale <- function(age)
  #====================================================================================================
{
  vgon = (3.3 + 90*(1 - exp(-(age/16.8)**6.7)))/1000 # Convert to kg
  return(vgon)
}

#====================================================================================================
getLifecourseHeartVolume <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseHeartVolumeMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseHeartVolumeFemale(age))
  }
}

#====================================================================================================
getLifecourseHeartVolumeMale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightMale(age)
  vhrt = exp(-2.502)*((h/100)**2.13)
  return(vhrt)

}

#====================================================================================================
getLifecourseHeartVolumeFemale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightFemale(age)
  vhrt = exp(-2.502)*((h/100)**2.13)
  return(vhrt)
}
#the gut volume comes from internal gut equations. Will be used for the GI compartment in the model
# if volume for individual compartments is needed use bosgra equations for individual compartments
getLifecourseGutVolume <- function(age,gender){
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseGutVolumeMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseGutVolumeFemale(age))
  }

}

getLifecourseGutVolumeMale <- function(age){
  mbw <- getLifecourseBodyWeightMale(age)
  vfat <- getLifecourseAdiposeVolumeMaleSciV(age)
  lbw <- mbw - vfat
  vgut <- 0.021*lbw
  return(vgut)
}

getLifecourseGutVolumeFemale <- function(age){
  mbw <- getLifecourseBodyWeightFemale(age)
  vfat <- getLifecourseAdiposeVolumeFemaleSciV(age)
  lbw <- mbw - vfat
  vgut <- 0.027*lbw
  return(vgut)
}

#====================================================================================================
getLifecourseIntestineVolume <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseIntestineVolumeMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseIntestineVolumeFemale(age))
  }
}

#====================================================================================================
getLifecourseIntestineVolumeMale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightMale(age)
  vint = exp(-1.351)*((h/100)**2.47)
  return(vint)
}

#====================================================================================================
getLifecourseIntestineVolumeFemale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightFemale(age)
  vint = exp(-1.351)*((h/100)**2.47)
  return(vint)
}

#====================================================================================================
getLifecourseKidneyVolume <- function(age, gender, source = "sciv")
  #====================================================================================================
{
  if(is.na(age)) return(NA)
  # remove this block once we have scitovation equations
  if (source == "sciv"){
    warning("Scitovation equations not found, Using bosgra equations instead")
    source = "bosgra"
  }
  if(source == "bosgra"){
    if(gender == "M") {
      return(getLifecourseKidneyVolumeMale(age))
    }
    else if(gender == "F") {
      return(getLifecourseKidneyVolumeFemale(age))
    }
  }else if(source == "sciv"){
    stop("No Scitovation Equations found")
  }


}

#====================================================================================================
getLifecourseKidneyVolumeMale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightMale(age)
  vkid = exp(-2.306)*((h/100)**1.93)
  return(vkid)
}

#====================================================================================================
getLifecourseKidneyVolumeFemale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightFemale(age)
  vkid = exp(-2.306)*((h/100)**1.93)
  return(vkid)
}

#====================================================================================================
getLifecourseLiverVolume <- function(age, gender, source = "sciv")
  #====================================================================================================
{
  if(is.na(age)) return(NA)
  if (source == "bosgra"){
    if(gender == "M") {
      return(getLifecourseLiverVolumeMale(age))
    }
    else if(gender == "F") {
      return(getLifecourseLiverVolumeFemale(age))
    }
  }else if(source == "sciv"){
    if(gender == "M") {
      return(getLifecourseLiverVolumeMaleSciV(age))
    }
    else if(gender == "F") {
      return(getLifecourseLiverVolumeFemaleSciV(age))
    }
  }


}

#====================================================================================================
getLifecourseLiverVolumeMale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightMale(age)
  vliv = exp(-0.6786)*((h/100)**1.98)
  return(vliv)
}

#====================================================================================================
getLifecourseLiverVolumeFemale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightFemale(age)
  vliv = exp(-0.6786)*((h/100)**1.98)
  return(vliv)
}

getLifecourseLiverVolumeMaleSciV<- function(age){
  mbw <- getLifecourseBodyWeightMale(age)
  mbsa <- getLifecourseBodySurfaceAreaMale(age)
  if (age < 23){
    a <- 0.05012
    b <- 0.78
    vliv <- a*mbw^b
  }else{
    # mean adult (25y) liver weight
    mliv268 <- 0.0512*getLifecourseBodyWeightMale(25)^0.78
    # mean adult (25y) body surface area
    mbsa268 <- 2.01
    a <- 1.0728
    b <- 0.3457
    vliv <- (a * mbsa - b) * mliv268 / (a * mbsa268 - b)

  }
}

getLifecourseLiverVolumeFemaleSciV<- function(age){
  mbw <- getLifecourseBodyWeightFemale(age)
  mbsa <- getLifecourseBodySurfaceAreaFemale(age)
  if (age < 23){
    a <- 0.05012
    b <- 0.78
    vliv <- a*mbw^b
  }else{
    # mean adult (25y) liver weight
    mliv268 <- 0.0512*getLifecourseBodyWeightFemale(25)^0.78
    # mean adult (25y) body surface area
    mbsa268 <- 1.75
    a <- 1.0728
    b <- 0.3457
    vliv <- (a * mbsa - b) * mliv268 / (a * mbsa268 - b)

  }
}


#====================================================================================================
getLifecourseLungVolume <- function(age, gender,source = "bosgra")
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  # remove this block once we have scitovation equations
  if (source == "sciv"){
    warning("Scitovation equations not found, Using bosgra equations instead")
    source = "bosgra"
  }

  if(source=="bosgra"){
    if(gender == "M") {
      return(getLifecourseLungVolumeMale(age))
    }
    else if(gender == "F") {
      return(getLifecourseLungVolumeFemale(age))
    }
  }

}

#====================================================================================================
getLifecourseLungVolumeMale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightMale(age)
  vliv = exp(-2.092)*((h/100)**2.1)
  return(vliv)
}

#====================================================================================================
getLifecourseLungVolumeFemale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightFemale(age)
  vliv = exp(-2.092)*((h/100)**2.1)
  return(vliv)
}

#====================================================================================================
getLifecoursePancreasVolume <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecoursePancreasVolumeMale(age))
  }
  else if(gender == "F") {
    return(getLifecoursePancreasVolumeFemale(age))
  }
}

#====================================================================================================
getLifecoursePancreasVolumeMale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightMale(age)
  vpan = exp(-3.431)*((h/100)**2.43)
  return(vpan)
}

#====================================================================================================
getLifecoursePancreasVolumeFemale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightFemale(age)
  vpan = exp(-3.431)*((h/100)**2.43)
  return(vpan)
}

#====================================================================================================
getLifecourseSkinVolume <- function(age, gender,source = "sciv")
  #====================================================================================================
{
  if(is.na(age)) return(NA)
  if(source == "bosgra"){
    if(gender == "M") {
      return(getLifecourseSkinVolumeMale(age))
    }
    else if(gender == "F") {
      return(getLifecourseSkinVolumeFemale(age))
    }
  }else if(source == "sciv"){
    if(gender == "M") {
      return(getLifecourseSkinVolumeMaleSciV(age))
    }
    else if(gender == "F") {
      return(getLifecourseSkinVolumeFemaleSciV(age))
    }
  }

}

#====================================================================================================
getLifecourseSkinVolumeMale <- function(age)
  #====================================================================================================
{
  bsa = getLifecourseBodySurfaceAreaMale(age)
  vskn = exp(1.64*bsa - 1.93)
  return(vskn)
}

#====================================================================================================
getLifecourseSkinVolumeFemale <- function(age)
  #====================================================================================================
{
  bsa = getLifecourseBodySurfaceAreaFemale(age)
  vskn = exp(1.64*bsa - 1.93)
  return(vskn)
}

getLifecourseSkinVolumeMaleSciV <- function(age){
  mbsa <- getLifecourseBodySurfaceAreaMale(age) # in m^2
  mbsa <- mbsa*10000
  depth <- 0.15 #in cm
  vskin <- (mbsa*depth)/1000
  return(vskin)
}

getLifecourseSkinVolumeFemaleSciV <- function(age){
  mbsa <- getLifecourseBodySurfaceAreaFemale(age) # in m^2
  mbsa <- mbsa*10000
  depth <- 0.15 #in cm
  vskin <- (mbsa*depth)/1000
  return(vskin)
}

#====================================================================================================
getLifecourseSpleenVolume <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseSpleenVolumeMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseSpleenVolumeFemale(age))
  }
}

#====================================================================================================
getLifecourseSpleenVolumeMale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightMale(age)
  vspl = exp(-3.123)*((h/100)**2.16)
  return(vspl)
}

#====================================================================================================
getLifecourseSpleenVolumeFemale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightFemale(age)
  vspl = exp(-3.123)*((h/100)**2.16)
  return(vspl)
}

#====================================================================================================
getLifecourseStomachVolume <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseStomachVolumeMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseStomachVolumeFemale(age))
  }
}

#====================================================================================================
getLifecourseStomachVolumeMale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightMale(age)
  vsto = exp(-3.266)*((h/100)**2.45)
  return(vsto)
}

#====================================================================================================
getLifecourseStomachVolumeFemale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightFemale(age)
  vsto = exp(-3.266)*((h/100)**2.45)
  return(vsto)
}

#====================================================================================================
getLifecourseThymusVolume <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseThymusVolumeMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseThymusVolumeFemale(age))
  }
}

#====================================================================================================
getLifecourseThymusVolumeMale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightMale(age)
  vthy = 14*((7.1 - 6.1*exp(-age/11.9))*(0.14 + 0.86*exp(-age/10.3)))/1000 # convert to kg
  return(vthy)
}

#====================================================================================================
getLifecourseThymusVolumeFemale <- function(age)
  #====================================================================================================
{
  # Note, same as male eqn
  h = getLifecourseBodyHeightFemale(age)
  vthy = 14*((7.1 - 6.1*exp(-age/11.9))*(0.14 + 0.86*exp(-age/10.3)))/1000 # convert to kg
  return(vthy)
}

#====================================================================================================
getLifecourseRemainingVolume <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseRemainingVolumeMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseRemainingVolumeFemale(age))
  }
}

#====================================================================================================
getLifecourseRemainingVolumeMale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightMale(age)
  vrem = exp(-0.072)*((h/100)**1.95)
  return(vrem)
}

#====================================================================================================
getLifecourseRemainingVolumeFemale <- function(age)
  #====================================================================================================
{
  h = getLifecourseBodyHeightFemale(age)
  vrem = exp(-0.072)*((h/100)**1.95)
  return(vrem)
}

#====================================================================================================
getLifecourseRapidlyPerfusedVolume <- function(age, gender,source = "sciv")
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  # remove this block once we have bosgra equations
  if (source == "bosgra"){
    warning("Bosgra equations not found, Using ScitoVation equations instead")
    source = "sciv"
  }
  if(source == "sciv"){
      if(gender == "M") {
        return(getLifecourseRapidlyPerfusedVolumeMaleSciV(age))
      }else if(gender == "F") {
        return(getLifecourseRapidlyPerfusedVolumeFemaleSciV(age))
      }
    }
}

getLifecourseRapidlyPerfusedVolumeMaleSciV<- function(age){
  vgut <- getLifecourseGutVolumeMale(age)
  vrpf <- 2.596*vgut
  return(vrpf)
}

getLifecourseRapidlyPerfusedVolumeFemaleSciV<- function(age){
  vgut <- getLifecourseGutVolumeFemale(age)
  vrpf <- 2.464*vgut
  return(vrpf)
}

#====================================================================================================
getLifecourseMuscleVolume <- function(age, gender,source="sciv")
  #====================================================================================================
{
  if(is.na(age)) return(NA)
  if (source == "bosgra"){
    if(gender == "M") {
      return(getLifecourseMuscleVolumeMale(age))
    }
    else if(gender == "F") {
      return(getLifecourseMuscleVolumeFemale(age))
    }
  }else if (source == "sciv"){
    if (gender == "M"){
      return(getLifecourseMuscleVolumeMaleSciV(age))
    }else if (gender == "F"){
      return(getLifecourseMuscleVolumeFemaleSciV(age))
    }

  }


}

#====================================================================================================
getLifecourseMuscleVolumeMale <- function(age)
  #====================================================================================================
{
  vmus = getLifecourseBodyWeightMale(age) -
    getLifecourseAdiposeVolumeMaleSciV(age) -
    getLifecourseBloodVolumeMale(age) -
    getLifecourseBoneVolumeMale(age) -
    getLifecourseBrainVolumeMale(age) -
    getLifecourseGonadVolumeMale(age) -
    getLifecourseHeartVolumeMale(age) -
    getLifecourseIntestineVolumeMale(age) -
    getLifecourseKidneyVolumeMale(age) -
    getLifecourseLiverVolumeMale(age) -
    getLifecourseLungVolumeMale(age) -
    getLifecoursePancreasVolumeMale(age) -
    getLifecourseRemainingVolumeMale(age) -
    getLifecourseSkinVolumeMale(age) -
    getLifecourseSpleenVolumeMale(age) -
    getLifecourseStomachVolumeMale(age) -
    getLifecourseThymusVolumeMale(age)

  return(vmus)
}

#====================================================================================================
getLifecourseMuscleVolumeFemale <- function(age)
  #====================================================================================================
{
  vmus = getLifecourseBodyWeightMale(age) -
    getLifecourseAdiposeVolumeFemaleSciV(age) -
    getLifecourseBloodVolumeFemale(age) -
    getLifecourseBoneVolumeFemale(age) -
    getLifecourseBrainVolumeFemale(age) -
    getLifecourseGonadVolumeFemale(age) -
    getLifecourseHeartVolumeFemale(age) -
    getLifecourseIntestineVolumeFemale(age) -
    getLifecourseKidneyVolumeFemale(age) -
    getLifecourseLiverVolumeFemale(age) -
    getLifecourseLungVolumeFemale(age) -
    getLifecoursePancreasVolumeFemale(age) -
    getLifecourseRemainingVolumeFemale(age) -
    getLifecourseSkinVolumeFemale(age) -
    getLifecourseSpleenVolumeFemale(age) -
    getLifecourseStomachVolumeFemale(age) -
    getLifecourseThymusVolumeFemale(age)

  return(vmus)
}


#====================================================================================================
getLifecourseSlowlyPerfusedVolume <- function(age, gender,perf_frct=0.85)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if (gender == "M"){
    return(getLifecourseSlowlyPerfusedVolumeMale(age,perf_frct))
  }else if (gender == "F"){
    return(getLifecourseSlowlyPerfusedVolumeFemale(age,perf_frct))
  }
}

getLifecourseSlowlyPerfusedVolumeMale <- function(age,perf_frct=0.85){
  bw <- getLifecourseBodyWeightMale(age)
  perfused_bw <- perf_frct*bw
  total_volume <- (getLifecourseGutVolume(age,"M")+
                     getLifecourseIntestineVolume(age,"M")+
                     getLifecourseLiverVolume(age,"M")+
                     getLifecourseBloodVolume(age,"M")+
                     getLifecourseAdiposeVolume(age,"M")+
                     getLifecourseBoneVolume(age,"M")+
                     getLifecourseBrainVolume(age,"M")+
                     getLifecourseHeartVolume(age,"M")+
                     getLifecourseKidneyVolume(age,"M")+
                     getLifecourseLungVolume(age,"M")+
                     getLifecourseSkinVolume(age,"M")+
                     getLifecourseMuscleVolume(age,"M")+
                     getLifecourseRapidlyPerfusedVolume(age,"M"))
  vol <- perfused_bw- total_volume
  vol <- ifelse(vol < 0, 1e-5,vol)
  return(vol)

}

getLifecourseSlowlyPerfusedVolumeFemale <- function(age,perf_frct=0.85){
  bw <- getLifecourseBodyWeightFemale(age)
  perfused_bw <- perf_frct*bw
  total_volume <- (getLifecourseGutVolume(age,"F")+
                     getLifecourseIntestineVolume(age,"F")+
                     getLifecourseLiverVolume(age,"F")+
                     getLifecourseBloodVolume(age,"F")+
                     getLifecourseAdiposeVolume(age,"F")+
                     getLifecourseBoneVolume(age,"F")+
                     getLifecourseBrainVolume(age,"F")+
                     getLifecourseHeartVolume(age,"F")+
                     getLifecourseKidneyVolume(age,"F")+
                     getLifecourseLungVolume(age,"F")+
                     getLifecourseSkinVolume(age,"F")+
                     getLifecourseMuscleVolume(age,"F")+
                     getLifecourseRapidlyPerfusedVolume(age,"F"))
  vol <- perfused_bw- total_volume
  vol <- ifelse(vol < 0, 1e-5,vol)
  return(vol)

}
#====================================================================================================
getLifecourseMuscleVolumeMale <- function(age)
#====================================================================================================
{
  vmus = getLifecourseBodyWeightMale(age) -
    getLifecourseAdiposeVolumeMaleSciV(age) -
    getLifecourseBloodVolumeMale(age) -
    getLifecourseBoneVolumeMale(age) -
    getLifecourseBrainVolumeMale(age) -
    getLifecourseGonadVolumeMale(age) -
    getLifecourseHeartVolumeMale(age) -
    getLifecourseIntestineVolumeMale(age) -
    getLifecourseKidneyVolumeMale(age) -
    getLifecourseLiverVolumeMale(age) -
    getLifecourseLungVolumeMale(age) -
    getLifecoursePancreasVolumeMale(age) -
    getLifecourseRemainingVolumeMale(age) -
    getLifecourseSkinVolumeMale(age) -
    getLifecourseSpleenVolumeMale(age) -
    getLifecourseStomachVolumeMale(age) -
    getLifecourseThymusVolumeMale(age)

  return(vmus)
}

#====================================================================================================
getLifecourseMuscleVolumeFemale <- function(age)
  #====================================================================================================
{
  vmus = getLifecourseBodyWeightMale(age) -
    getLifecourseAdiposeVolumeFemaleSciV(age) -
    getLifecourseBloodVolumeFemale(age) -
    getLifecourseBoneVolumeFemale(age) -
    getLifecourseBrainVolumeFemale(age) -
    getLifecourseGonadVolumeFemale(age) -
    getLifecourseHeartVolumeFemale(age) -
    getLifecourseIntestineVolumeFemale(age) -
    getLifecourseKidneyVolumeFemale(age) -
    getLifecourseLiverVolumeFemale(age) -
    getLifecourseLungVolumeFemale(age) -
    getLifecoursePancreasVolumeFemale(age) -
    getLifecourseRemainingVolumeFemale(age) -
    getLifecourseSkinVolumeFemale(age) -
    getLifecourseSpleenVolumeFemale(age) -
    getLifecourseStomachVolumeFemale(age) -
    getLifecourseThymusVolumeFemale(age)

  return(vmus)
}
getLifecourseMuscleVolumeMaleSciV<- function(age){
  # calculated using linear interpolation
  x <- c(0,1,5,10,15,25)
  y <- c(0.8,1.9,5.6,11,24,29)
  vals <- approx(x,y,age,"linear",rule = 2)
  return(vals$y)
}

getLifecourseMuscleVolumeFemaleSciV<- function(age){
  # calculated using linear interpolation
  x <- c(0,1,5,10,15,25)
  y <- c(0.8,1.9,5.6,11,17,17.5)
  vals <- approx(x,y,age,"linear",rule = 2)
  return(vals$y)
}

#====================================================================================================
getLifecourseTissueVolumeSum <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseTissueVolumeSumMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseTissueVolumeSumFemale(age))
  }
}

#====================================================================================================
getLifecourseTissueVolumeSumMale <- function(age)
  #====================================================================================================
{
  vall = +
    getLifecourseAdiposeVolumeMaleSciV(age) +
    getLifecourseBloodVolumeMale(age) +
    getLifecourseBoneVolumeMale(age) +
    getLifecourseBrainVolumeMale(age) +
    getLifecourseGonadVolumeMale(age) +
    getLifecourseHeartVolumeMale(age) +
    getLifecourseIntestineVolumeMale(age) +
    getLifecourseKidneyVolumeMale(age) +
    getLifecourseLiverVolumeMale(age) +
    getLifecourseLungVolumeMale(age) +
    getLifecoursePancreasVolumeMale(age) +
    getLifecourseRemainingVolumeMale(age) +
    getLifecourseSkinVolumeMale(age) +
    getLifecourseSpleenVolumeMale(age) +
    getLifecourseStomachVolumeMale(age) +
    getLifecourseThymusVolumeMale(age) +
    getLifecourseMuscleVolumeMale(age)

  return(vall)
}

#====================================================================================================
getLifecourseTissueVolumeSumFemale <- function(age)
  #====================================================================================================
{
  vall = +
    getLifecourseAdiposeVolumeFemaleSciV(age) +
    getLifecourseBloodVolumeFemale(age) +
    getLifecourseBoneVolumeFemale(age) +
    getLifecourseBrainVolumeFemale(age) +
    getLifecourseGonadVolumeFemale(age) +
    getLifecourseHeartVolumeFemale(age) +
    getLifecourseIntestineVolumeFemale(age) +
    getLifecourseKidneyVolumeFemale(age) +
    getLifecourseLiverVolumeFemale(age) +
    getLifecourseLungVolumeFemale(age) +
    getLifecoursePancreasVolumeFemale(age) +
    getLifecourseRemainingVolumeFemale(age) +
    getLifecourseSkinVolumeFemale(age) +
    getLifecourseSpleenVolumeFemale(age) +
    getLifecourseStomachVolumeFemale(age) +
    getLifecourseThymusVolumeFemale(age) +
    getLifecourseMuscleVolumeFemale(age)

  return(vall)
}

#====================================================================================================
getLifecourseAdiposePerfusion <- function(age, gender, source = "sciv")
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(source == "bosgra"){
    if(gender == "M") {
      return(getLifecourseAdiposePerfusionMale(age))
    }
    else if(gender == "F") {
      return(getLifecourseAdiposePerfusionFemale(age))
    }
  }else if(source == "sciv"){
    if(gender == "M") {
      return(getLifecourseAdiposePerfusionMaleSciV(age))
    }
    else if(gender == "F") {
      return(getLifecourseAdiposePerfusionFemaleSciV(age))
    }
  }


}

getLifecourseAdiposePerfusionMaleSciV<- function(age){
  vfatc25 = 0.238
  qfatc25 = 0.05
  vfat <- getLifecourseAdiposeVolumeMaleSciV(age)
  bw <- getLifecourseBodyWeightMale(age)
  qc <- getLifecourseCardiacOutput(age,"M")
  vfatc <- vfat/bw
  qfatc <- (vfatc/vfatc25)*qfatc25
  qfat <- qfatc*qc
  return(qfat)
}

getLifecourseAdiposePerfusionFemaleSciV<- function(age){
  vfatc25 = 0.368
  qfatc25 = 0.085
  vfat <- getLifecourseAdiposeVolumeFemaleSciV(age)
  bw <- getLifecourseBodyWeightFemale(age)
  qc <- getLifecourseCardiacOutput(age,"F")
  vfatc <- vfat/bw
  qfatc <- (vfatc/vfatc25)*qfatc25
  qfat <- qfatc*qc
  return(qfat)
}

#====================================================================================================
getLifecourseAdiposePerfusionMale <- function(age)
  #====================================================================================================
{
  m = getLifecourseAdiposeVolumeMaleSciV(age)
  m35 = getLifecourseAdiposeVolumeMaleSciV(35)
  q = m*19.5/m35
  return(q)
}

#====================================================================================================
getLifecourseAdiposePerfusionFemale <- function(age)
  #====================================================================================================
{
  m = getLifecourseAdiposeVolumeFemaleSciV(age)
  m35 = getLifecourseAdiposeVolumeFemaleSciV(35)
  q = m*30.1/m35
  return(q)
}

#====================================================================================================
getLifecourseBonePerfusion <- function(age, gender, source = "sciv")
#====================================================================================================
{
  if(is.na(age)) return(NA)

  if(source == "bosgra"){
    if(gender == "M") {
      return(getLifecourseBonePerfusionMale(age))
    }
    else if(gender == "F") {
      return(getLifecourseBonePerfusionFemale(age))
    }
  }else if(source == "sciv"){
    if(gender == "M") {
      return(getLifecourseBonePerfusionMaleSciV(age))
    }
    else if(gender == "F") {
      return(getLifecourseBonePerfusionFemaleSciV(age))
    }
  }
}

getLifecourseBonePerfusionMaleSciV<- function(age){
  qbone25c <- 0.03
  qc <- getLifecourseCardiacOutput(age,"M")
  bw25 <- getLifecourseBodyWeightMale(25)
  bw <- getLifecourseBodyWeightMale(age)
  vbonec25 <- getLifecourseBoneVolumeMaleSciV(25)/bw25
  vbonec <- getLifecourseBoneVolumeMaleSciV(age)/bw
  qbone <- qc*(vbonec/vbonec25)*qbone25c
  return(qbone)
}

getLifecourseBonePerfusionFemaleSciV<- function(age){
  qbone25c <- 0.03
  qc <- getLifecourseCardiacOutput(age,"F")
  bw25 <- getLifecourseBodyWeightFemale(25)
  bw <- getLifecourseBodyWeightFemale(age)
  vbonec25 <- getLifecourseBoneVolumeFemaleSciV(25)/bw25
  vbonec <- getLifecourseBoneVolumeFemaleSciV(age)/bw
  qbone <- qc*(vbonec/vbonec25)*qbone25c
  return(qbone)
}
#====================================================================================================
getLifecourseBonePerfusionMale <- function(age)
  #====================================================================================================
{
  m = getLifecourseBoneVolumeMale(age)
  m35 = getLifecourseBoneVolumeMale(35)
  q = m*7.8/m35
  return(q)
}

#====================================================================================================
getLifecourseBonePerfusionFemale <- function(age)
  #====================================================================================================
{
  m = getLifecourseBoneVolumeFemale(age)
  m35 = getLifecourseBoneVolumeFemale(35)
  q = m*7.1/m35
  return(q)
}

#====================================================================================================
getLifecourseBrainPerfusion <- function(age, gender,source = "sciv")
#====================================================================================================
{
  if(is.na(age)) return(NA)

  if(source == "bosgra"){
    if(gender == "M") {
      return(getLifecourseBrainPerfusionMale(age))
    }
    else if(gender == "F") {
      return(getLifecourseBrainPerfusionFemale(age))
    }
  }else if (source == "sciv"){
    if(gender == "M") {
      return(getLifecourseBrainPerfusionMaleSciV(age))
    }
    else if(gender == "F") {
      return(getLifecourseBrainPerfusionFemaleSciV(age))
    }
  }
}

#====================================================================================================
getLifecourseBrainPerfusionMale <- function(age)
  #====================================================================================================
{
  m = getLifecourseBrainVolumeMale(age)
  m35 = getLifecourseBrainVolumeMale(35)
  q = m*46.8/m35
  return(q)
}

#====================================================================================================
getLifecourseBrainPerfusionFemale <- function(age)
  #====================================================================================================
{
  m = getLifecourseBrainVolumeFemale(age)
  m35 = getLifecourseBrainVolumeFemale(35)
  q = m*42.5/m35
  return(q)
}

getLifecourseBrainPerfusionMaleSciV<- function(age){
  qc <- getLifecourseCardiacOutput(age,"M")
  qbrnc <- (3/age)*exp(-0.5*(log(age/41.92)/1.876)^2)
  qbrn <- qbrnc*qc
  return(qbrn)
}

getLifecourseBrainPerfusionFemaleSciV<- function(age){
  qc <- getLifecourseCardiacOutput(age,"F")
  qbrnc <- (3.064/age)*exp(-0.5*(log(age/47.57)/1.94)^2)
  qbrn <- qbrnc*qc
  return(qbrn)
}
#====================================================================================================
getLifecourseGonadPerfusion <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseGonadPerfusionMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseGonadPerfusionFemale(age))
  }
}

#====================================================================================================
getLifecourseGonadPerfusionMale <- function(age)
  #====================================================================================================
{
  m = getLifecourseGonadVolumeMale(age)
  m35 = getLifecourseGonadVolumeMale(35)
  q = m*0.195/m35
  return(q)
}

#====================================================================================================
getLifecourseGonadPerfusionFemale <- function(age)
  #====================================================================================================
{
  m = getLifecourseGonadVolumeFemale(age)
  m35 = getLifecourseGonadVolumeFemale(35)
  q = m*0.071/m35
  return(q)
}

#====================================================================================================
getLifecourseHeartPerfusion <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseHeartPerfusionMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseHeartPerfusionFemale(age))
  }
}

#====================================================================================================
getLifecourseHeartPerfusionMale <- function(age)
  #====================================================================================================
{
  m = getLifecourseHeartVolumeMale(age)
  m35 = getLifecourseHeartVolumeMale(35)
  q = m*15.6/m35
  return(q)
}

#====================================================================================================
getLifecourseHeartPerfusionFemale <- function(age)
  #====================================================================================================
{
  m = getLifecourseHeartVolumeFemale(age)
  m35 = getLifecourseHeartVolumeFemale(35)
  q = m*17.7/m35
  return(q)
}

#====================================================================================================
getLifecourseIntestinePerfusion <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseIntestinePerfusionMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseIntestinePerfusionFemale(age))
  }
}

#====================================================================================================
getLifecourseIntestinePerfusionMale <- function(age)
  #====================================================================================================
{
  m = getLifecourseIntestineVolumeMale(age)
  m35 = getLifecourseIntestineVolumeMale(35)
  q = m*54.6/m35
  return(q)
}

#====================================================================================================
getLifecourseIntestinePerfusionFemale <- function(age)
  #====================================================================================================
{
  m = getLifecourseIntestineVolumeFemale(age)
  m35 = getLifecourseIntestineVolumeFemale(35)
  q = m*56.6/m35
  return(q)
}

#====================================================================================================
getLifecourseKidneyPerfusion <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseKidneyPerfusionMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseKidneyPerfusionFemale(age))
  }
}

#====================================================================================================
getLifecourseKidneyPerfusionMale <- function(age)
  #====================================================================================================
{
  m = getLifecourseKidneyVolumeMale(age)
  m35 = getLifecourseKidneyVolumeMale(35)
  q = m*74.1/m35
  return(q)
}

#====================================================================================================
getLifecourseKidneyPerfusionFemale <- function(age)
  #====================================================================================================
{
  m = getLifecourseKidneyVolumeFemale(age)
  m35 = getLifecourseKidneyVolumeFemale(35)
  q = m*60.2/m35
  return(q)
}

#====================================================================================================
getLifecourseLiverArterialPerfusion <- function(age, gender, source = "sciv")
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(source == "bosgra"){
    if(gender == "M") {
      return(getLifecourseLiverArterialPerfusionMale(age))
    }
    else if(gender == "F") {
      return(getLifecourseLiverArterialPerfusionFemale(age))
    }
  }else if (source == "sciv"){
    if(gender == "M") {
      return(getLifecourseLiverArterialPerfusionMaleSciV(age))
    }
    else if(gender == "F") {
      return(getLifecourseLiverArterialPerfusionFemaleSciV(age))
    }
  }
}

#====================================================================================================
getLifecourseLiverArterialPerfusionMale <- function(age)
  #====================================================================================================
{
  m = getLifecourseLiverVolumeMale(age)
  m35 = getLifecourseLiverVolumeMale(35)
  q = m*25.35/m35
  return(q)
}

#====================================================================================================
getLifecourseLiverArterialPerfusionFemale <- function(age)
  #====================================================================================================
{
  m = getLifecourseLiverVolumeFemale(age)
  m35 = getLifecourseLiverVolumeFemale(35)
  q = m*23.0/m35
  return(q)
}

getLifecourseLiverArterialPerfusionMaleSciV<- function(age){
  vliv <- getLifecourseLiverVolumeMaleSciV(age)
  bw <- getLifecourseBodyWeightMale(age)
  qc <- getLifecourseCardiacOutput(age,"M")
  vlivc <- vliv/bw
  qlivartc <- (vlivc/0.0199)*0.065
  qlivart <- qlivartc*qc
  return(qlivart)
}

getLifecourseLiverArterialPerfusionFemaleSciV<- function(age){
  vliv <- getLifecourseLiverVolumeFemaleSciV(age)
  bw <- getLifecourseBodyWeightFemale(age)
  qc <- getLifecourseCardiacOutput(age,"F")
  vlivc <- vliv/bw
  qlivartc <- (vlivc/0.0199)*0.065
  qlivart <- qlivartc*qc
  return(qlivart)
}

getLifecourseGutPerfusion<- function(age,gender){
  if(is.na(age)) return(NA)

  if(gender == "M"){
    return(getLifecourseGutPerfusionMale(age))
  }else if(gender == "F"){
    return(getLifecourseGutPerfusionFemale(age))
  }
}

getLifecourseGutPerfusionMale<- function(age){
  vgutc25 <- 0.016
  qgutc25 <- 0.15
  vgut <- getLifecourseGutVolumeMale(age)
  bw <- getLifecourseBodyWeightMale(age)
  qc <- getLifecourseCardiacOutput(age,"M")
  vgutc <- vgut/bw
  qgutc <- (vgutc/vgutc25)*qgutc25
  qgut <- qgutc *qc
  return(qgut)
}

getLifecourseGutPerfusionFemale<- function(age){
  vgutc25 <- 0.0170660419467526
  qgutc25 <- 0.17
  vgut <- getLifecourseGutVolumeFemale(age)
  bw <- getLifecourseBodyWeightFemale(age)
  qc <- getLifecourseCardiacOutput(age,"F")
  vgutc <- vgut/bw
  qgutc <- (vgutc/vgutc25)*qgutc25
  qgut <- qgutc *qc
  return(qgut)
}
#====================================================================================================
getLifecourseLiverSplancnicPerfusion <- function(age, gender)
#====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseLiverSplancnicPerfusionMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseLiverSplancnicPerfusionFemale(age))
  }
}

#====================================================================================================
getLifecourseLiverSplancnicPerfusionMale <- function(age)
  #====================================================================================================
{
  q = getLifecoursePancreasPerfusionMale(age) +
    getLifecourseSpleenPerfusionMale(age) +
    getLifecourseStomachPerfusionMale(age) +
    getLifecourseIntestinePerfusionMale(age)

  return(q)
}

#====================================================================================================
getLifecourseLiverSplancnicPerfusionFemale <- function(age)
  #====================================================================================================
{
  q = getLifecoursePancreasPerfusionFemale(age) +
    getLifecourseSpleenPerfusionFemale(age) +
    getLifecourseStomachPerfusionFemale(age) +
    getLifecourseIntestinePerfusionFemale(age)

  return(q)
}

#====================================================================================================
getLifecourseLiverTotalPerfusion <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseLiverTotalPerfusionMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseLiverTotalPerfusionFemale(age))
  }
}

#====================================================================================================
getLifecourseLiverTotalPerfusionMale <- function(age)
  #====================================================================================================
{
  q = getLifecourseLiverArterialPerfusionMale(age) +
    getLifecourseLiverSplancnicPerfusionMale(age)

  return(q)
}

#====================================================================================================
getLifecourseLiverTotalPerfusionFemale <- function(age)
  #====================================================================================================
{
  q = getLifecourseLiverArterialPerfusionFemale(age) +
    getLifecourseLiverSplancnicPerfusionFemale(age)

  return(q)
}

#====================================================================================================
getLifecourseMusclePerfusion <- function(age, gender, source = "sciv")
  #====================================================================================================
{
  if(is.na(age)) return(NA)
  if(source == "sciv"){
    if(gender == "M") {
      return(getLifecourseMusclePerfusionMaleSciV(age))
    }
    else if(gender == "F") {
      return(getLifecourseMusclePerfusionFemaleSciV(age))
    }
  }else if(source == "bosgra"){
    if(gender == "M") {
      return(getLifecourseMusclePerfusionMale(age))
    }
    else if(gender == "F") {
      return(getLifecourseMusclePerfusionFemale(age))
    }
  }


}

getLifecourseMusclePerfusionMaleSciV <- function(age){
  vmuscc25 <- getLifecourseMuscleVolumeMaleSciV(25)/getLifecourseBodyWeightMale(25)
  qmuscc25 <- 0.17
  vmusc <- getLifecourseMuscleVolumeMaleSciV(age)
  bw <- getLifecourseBodyWeightMale(age)
  qc <- getLifecourseCardiacOutput(age,"M")
  vmuscc <- vmusc/bw
  qmuscc <- (vmuscc/vmuscc25)*qmuscc25
  qmusc <- qmuscc *qc
  return(qmusc)
}

getLifecourseMusclePerfusionFemaleSciV <- function(age){
  vmuscc25 <- getLifecourseMuscleVolumeFemaleSciV(25)/getLifecourseBodyWeightFemale(25)
  qmuscc25 <- 0.12
  vmusc <- getLifecourseMuscleVolumeFemaleSciV(age)
  bw <- getLifecourseBodyWeightFemale(age)
  qc <- getLifecourseCardiacOutput(age,"F")
  vmuscc <- vmusc/bw
  qmuscc <- (vmuscc/vmuscc25)*qmuscc25
  qmusc <- qmuscc *qc
  return(qmusc)
}


#====================================================================================================
getLifecourseMusclePerfusionMale <- function(age)
  #====================================================================================================
{
  m = getLifecourseMuscleVolumeMaleSciV(age)
  m35 = getLifecourseMuscleVolumeMaleSciV(35)
  q = m*66.3/m35
  return(q)
}

#====================================================================================================
getLifecourseMusclePerfusionFemale <- function(age)
  #====================================================================================================
{
  m = getLifecourseMuscleVolumeFemaleSciV(age)
  m35 = getLifecourseMuscleVolumeFemaleSciV(35)
  q = m*42.5/m35
  return(q)
}

#====================================================================================================
getLifecoursePancreasPerfusion <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecoursePancreasPerfusionMale(age))
  }
  else if(gender == "F") {
    return(getLifecoursePancreasPerfusionFemale(age))
  }
}

#====================================================================================================
getLifecoursePancreasPerfusionMale <- function(age)
  #====================================================================================================
{
  m = getLifecoursePancreasVolumeMale(age)
  m35 = getLifecoursePancreasVolumeMale(35)
  q = m*3.9/m35
  return(q)
}

#====================================================================================================
getLifecoursePancreasPerfusionFemale <- function(age)
#====================================================================================================
{
  m = getLifecoursePancreasVolumeFemale(age)
  m35 = getLifecoursePancreasVolumeFemale(35)
  q = m*3.54/m35
  return(q)
}

#====================================================================================================
getLifecourseSkinPerfusion <- function(age, gender, source = "sciv")
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if (source == "bosgra"){
    if(gender == "M") {
      return(getLifecourseSkinPerfusionMale(age))
    }
    else if(gender == "F") {
      return(getLifecourseSkinPerfusionFemale(age))
    }
  }else if(source == "sciv"){
    if(gender == "M") {
      return(getLifecourseSkinPerfusionMaleSciV(age))
    }
    else if(gender == "F") {
      return(getLifecourseSkinPerfusionFemaleSciV(age))
    }
  }
}

#====================================================================================================
getLifecourseSkinPerfusionMale <- function(age)
  #====================================================================================================
{
  m = getLifecourseSkinVolumeMale(age)
  m35 = getLifecourseSkinVolumeMale(35)
  q = m*19.5/m35
  return(q)
}

getLifecourseSkinPerfusionMaleSciV<- function(age){
  vsknc25 <- getLifecourseSkinVolumeMaleSciV(25)/getLifecourseBodyWeightMale(25)
  qsknc25 <- 0.058
  vskn <- getLifecourseSkinVolumeMaleSciV(age)
  bw <- getLifecourseBodyWeightMale(age)
  qc <- getLifecourseCardiacOutput(age,"M")
  vsknc <- vskn/bw
  qsknc <- (vsknc/vsknc25)*qsknc25
  qskn <- qsknc *qc
  return(qskn)
}

getLifecourseSkinPerfusionFemaleSciV<- function(age){
  vsknc25 <- getLifecourseSkinVolumeFemaleSciV(25)/getLifecourseBodyWeightFemale(25)
  qsknc25 <- 0.058
  vskn <- getLifecourseSkinVolumeFemaleSciV(age)
  bw <- getLifecourseBodyWeightFemale(age)
  qc <- getLifecourseCardiacOutput(age,"F")
  vsknc <- vskn/bw
  qsknc <- (vsknc/vsknc25)*qsknc25
  qskn <- qsknc *qc
  return(qskn)
}

#====================================================================================================
getLifecourseSkinPerfusionFemale <- function(age)
  #====================================================================================================
{
  m = getLifecourseSkinVolumeFemale(age)
  m35 = getLifecourseSkinVolumeFemale(35)
  q = m*17.7/m35
  return(q)
}

#====================================================================================================
getLifecourseSpleenPerfusion <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseSpleenPerfusionMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseSpleenPerfusionFemale(age))
  }
}

#====================================================================================================
getLifecourseSpleenPerfusionMale <- function(age)
  #====================================================================================================
{
  m = getLifecourseSpleenVolumeMale(age)
  m35 = getLifecourseSpleenVolumeMale(35)
  q = m*11.7/m35
  return(q)
}

#====================================================================================================
getLifecourseSpleenPerfusionFemale <- function(age)
  #====================================================================================================
{
  m = getLifecourseSpleenVolumeFemale(age)
  m35 = getLifecourseSpleenVolumeFemale(35)
  q = m*10.6/m35
  return(q)
}

#====================================================================================================
getLifecourseStomachPerfusion <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseStomachPerfusionMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseStomachPerfusionFemale(age))
  }
}

#====================================================================================================
getLifecourseStomachPerfusionMale <- function(age)
  #====================================================================================================
{
  m = getLifecourseStomachVolumeMale(age)
  m35 = getLifecourseStomachVolumeMale(35)
  q = m*3.9/m35
  return(q)
}

#====================================================================================================
getLifecourseStomachPerfusionFemale <- function(age)
  #====================================================================================================
{
  m = getLifecourseStomachVolumeFemale(age)
  m35 = getLifecourseStomachVolumeFemale(35)
  q = m*3.54/m35
  return(q)
}

#====================================================================================================
getLifecourseThymusPerfusion <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseThymusPerfusionMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseThymusPerfusionFemale(age))
  }
}

#====================================================================================================
getLifecourseThymusPerfusionMale <- function(age)
  #====================================================================================================
{
  m = getLifecourseThymusVolumeMale(age)
  m35 = getLifecourseThymusVolumeMale(35)
  q = m*0.39/m35
  return(q)
}

#====================================================================================================
getLifecourseThymusPerfusionFemale <- function(age)
  #====================================================================================================
{
  m = getLifecourseThymusVolumeFemale(age)
  m35 = getLifecourseThymusVolumeFemale(35)
  q = m*0.37/m35
  return(q)
}

#====================================================================================================
getLifecourseRemainingPerfusion <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseRemainingPerfusionMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseRemainingPerfusionFemale(age))
  }
}

#====================================================================================================
getLifecourseRemainingPerfusionMale <- function(age)
  #====================================================================================================
{
  m = getLifecourseRemainingVolumeMale(age)
  m35 = getLifecourseRemainingVolumeMale(35)
  q = m*21.8/m35
  return(q)
}

#====================================================================================================
getLifecourseRemainingPerfusionFemale <- function(age)
  #====================================================================================================
{
  m = getLifecourseRemainingVolumeFemale(age)
  m35 = getLifecourseRemainingVolumeFemale(35)
  q = m*20.5/m35
  return(q)
}

#====================================================================================================
getLifecourseLungPerfusion <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseLungPerfusionMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseLungPerfusionFemale(age))
  }
}

#====================================================================================================
getLifecourseLungPerfusionMale <- function(age)
  #====================================================================================================
{
  # Using data from Jongeneelen...
  # Their reported lung perfusion is not cardiac output,
  # but a small arterial flow (fraction of their reported CO)
  q0 = 390*0.03  # They report CO as 390 L/h, their perfusion fraction if 0.03
  m = getLifecourseRemainingVolumeMale(age)
  m35 = getLifecourseRemainingVolumeMale(35)
  q = m*q0/m35
  return(q)
}

#====================================================================================================
getLifecourseLungPerfusionFemale <- function(age)
  #====================================================================================================
{
  # Using data from Joneneelen...
  # Their reported lung perfusion is not cardiac output,
  # but a small arterial flow (fraction of their reported CO)
  q0 = 390*0.03  # They report CO as 390 L/h, their perfusion fraction if 0.03
  m = getLifecourseRemainingVolumeFemale(age)
  m35 = getLifecourseRemainingVolumeFemale(35)
  q = m*q0/m35
  return(q)
}

#===========
getLifecourseRichlyPerfusedTissuePerfusion<- function(age,gender){
  if (is.na(age)) return(NA)

  if(gender == "M"){
    getLifecourseRichlyPerfusedTissuePerfusionMale(age)
  }else if(gender == "F"){
    getLifecourseRichlyPerfusedTissuePerfusionFemale(age)
  }
}

getLifecourseRichlyPerfusedTissuePerfusionMale <- function(age){
  vrpfc25 <- 0.042
  qrpfc25 <- 0.215
  vrpf <- getLifecourseRapidlyPerfusedVolumeMaleSciV(age)
  bw <- getLifecourseBodyWeightMale(age)
  qc <- getLifecourseCardiacOutput(age,"M")
  vrpfc <- vrpf/bw
  qrpfc <- (vrpfc/vrpfc25)*qrpfc25
  qrpf <- qrpfc *qc
  return(qrpf)
}

getLifecourseRichlyPerfusedTissuePerfusionFemale <- function(age){
  vrpfc25 <- 0.042
  qrpfc25 <- 0.215
  vrpf <- getLifecourseRapidlyPerfusedVolumeFemaleSciV(age)
  bw <- getLifecourseBodyWeightFemale(age)
  qc <- getLifecourseCardiacOutput(age,"F")
  vrpfc <- vrpf/bw
  qrpfc <- (vrpfc/vrpfc25)*qrpfc25
  qrpf <- qrpfc *qc
  return(qrpf)
}

#===========
getLifecourseSlowlyPerfusedTissuePerfusion<- function(age,gender){
  if (is.na(age)) return(NA)

  if(gender == "M"){
    getLifecourseSlowlyPerfusedTissuePerfusionMale(age)
  }else if(gender == "F"){
    getLifecourseSlowlyPerfusedTissuePerfusionFemale(age)
  }
}

getLifecourseSlowlyPerfusedTissuePerfusionMale <- function(age){
  vspfc25 <- getLifecourseSlowlyPerfusedVolumeMale(25)/getLifecourseBodyWeightMale(25)
  qspfc25 <- 0.190 - 0.058 # 0.058 was fractional skin perfion
  vspf <- getLifecourseSlowlyPerfusedVolumeMale(age)
  bw <- getLifecourseBodyWeightMale(age)
  qc <- getLifecourseCardiacOutput(age,"M")
  vspfc <- vspf/bw
  qspfc <- (vspfc/vspfc25)*qspfc25
  qspf <- qspfc *qc
  return(qspf)
}

getLifecourseSlowlyPerfusedTissuePerfusionFemale <- function(age){
  vspfc25 <- getLifecourseSlowlyPerfusedVolumeFemale(25)/getLifecourseBodyWeightFemale(25)
  qspfc25 <- 0.190 - 0.058 # 0.058 was fractional skin perfion
  vspf <- getLifecourseSlowlyPerfusedVolumeFemale(age)
  bw <- getLifecourseBodyWeightFemale(age)
  qc <- getLifecourseCardiacOutput(age,"F")
  vspfc <- vspf/bw
  qspfc <- (vspfc/vspfc25)*qspfc25
  qspf <- qspfc *qc
  return(qspf)
}

#' Get the cardiac output based on the life course equations
#' @description Get the cardiac output for a specific age and gender. Uses either Bosgra or ScitoVation equations
#' @param age Age in years 
#' @param gender Gender can be either "M" for male or "F" for female
#' @param source Source of the equations. Either from Bosgra et al. "bosgra" or from ScitoVation publications as "sciv"
#' @param qc_var variability for cardiac output. Used to account for exercise level. Can only be used when source = "sciv"
#' @export
#' 
getLifecourseCardiacOutput <- function(age, gender, source = "sciv",qc_var= 0)
  #====================================================================================================
{
  if(is.na(age)) return(NA)
  if (source == "bosgra"){
    if(gender == "M") {
      return(getLifecourseCardiacOutputMale(age))
    }
    else if(gender == "F") {
      return(getLifecourseCardiacOutputFemale(age))
    }
  }else if(source == "sciv"){
    if(gender == "M") {
      return(getLifecourseCardiacOutputMaleSciV(age,qc_var))
    }
    else if(gender == "F") {
      return(getLifecourseCardiacOutputFemaleSciV(age,qc_var))
    }
  }
}
#============================
getLifecourseCardiacOutputMaleSciV<- function(age,qc_var){
  mbsa <- getLifecourseBodySurfaceAreaMale(age)
  # scaling factor for body surface area to cardiac output
  bsa_qc_scaling <- 3.5
  #  QC min is variability factor for inter individual variation in QC,
  # can be also used to adjust cardiac output based on activity level
  qc <- mbsa*bsa_qc_scaling*(1+qc_var)*60
}

#============================
getLifecourseCardiacOutputFemaleSciV<- function(age,qc_var){
  mbsa <- getLifecourseBodySurfaceAreaFemale(age)
  # scaling factor for body surface area to cardiac output
  bsa_qc_scaling <- 3.5
  #  QC min is variability factor for inter individual variation in QC,
  # can be also used to adjust cardiac output based on activity level
  qc <- mbsa*bsa_qc_scaling*(1+qc_var)*60
}
#====================================================================================================
getLifecourseCardiacOutputMale <- function(age)
  #====================================================================================================
{
  q  = getLifecourseAdiposePerfusionMale(age) +
    getLifecourseBonePerfusionMale(age) +
    getLifecourseBrainPerfusionMale(age) +
    getLifecourseGonadPerfusionMale(age) +
    getLifecourseHeartPerfusionMale(age) +
    getLifecourseKidneyPerfusionMale(age) +
    getLifecourseLiverArterialPerfusionMale(age) +
    getLifecourseMusclePerfusionMale(age) +
    getLifecourseRemainingPerfusionMale(age) +
    getLifecourseSkinPerfusionMale(age) +
    getLifecourseThymusPerfusionMale(age) +
    getLifecourseIntestinePerfusionMale(age) +
    getLifecoursePancreasPerfusionMale(age) +
    getLifecourseSpleenPerfusionMale(age) +
    getLifecourseStomachPerfusionMale(age)

  return(q)
}

#====================================================================================================
getLifecourseCardiacOutputFemale <- function(age)
  #====================================================================================================
{
  q  = getLifecourseAdiposePerfusionFemale(age) +
    getLifecourseBonePerfusionFemale(age) +
    getLifecourseBrainPerfusionFemale(age) +
    getLifecourseGonadPerfusionFemale(age)+
    getLifecourseHeartPerfusionFemale(age) +
    getLifecourseKidneyPerfusionFemale(age) +
    getLifecourseLiverArterialPerfusionFemale(age) +
    getLifecourseMusclePerfusionFemale(age) +
    getLifecourseRemainingPerfusionFemale(age) +
    getLifecourseSkinPerfusionFemale(age) +
    getLifecourseThymusPerfusionFemale(age) +
    getLifecourseIntestinePerfusionFemale(age) +
    getLifecoursePancreasPerfusionFemale(age) +
    getLifecourseSpleenPerfusionFemale(age) +
    getLifecourseStomachPerfusionFemale(age)

  return(q)
}

#' Get the ventilation rate for a given age and gender
#' @description Uses life course equation to calculate a ventilation rate for a specific age and gender
#' @param age Age in years
#' @param gender Either "M" for Male for "F" for Female
#' @param activity Activity level. Can be "rest" or "light exercise"
#' @param source source of equations either "sciv" or "bosgra"
#' @export
getLifecourseVentilationRate <- function(age, gender,activity="rest",source="sciv")
#====================================================================================================
{
  if(is.na(age)) return(NA)

  if (source == "bosgra"){
    if (activity != "rest"){
      warning(sprintf(
        "The source does not have valid equations for activity type '%s'.
        Using the default 'rest' activity instead",activity)
      )
    }
    if(gender == "M") {
      return(getLifecourseVentilationRateMale(age))
    }
    else if(gender == "F") {
      return(getLifecourseVentilationRateFemale(age))
    }
  } else if(source == "sciv") {
    if(gender == "M"){
      return(getLifecourseVentilationRateMaleSCIV(age,activity))
    }else if(gender == "F"){
      return(getLifecourseVentilationRateFemaleSCIV(age,activity))
    }
  }


}
#=====
getLifecourseVentilationRateMaleSCIV <- function(age,activity){
  if (activity == "rest"){
   return(0.4493*exp(log(0.09919/0.4493)*exp(-0.175*age))*1000)
  }
}

#=======
getLifecourseVentilationRateFemaleSCIV<- function(age,activity){
  if (activity == "rest"){
    return(0.3255*exp(log(0.08771/0.3255)*exp(-0.3731*age))*1000)
  }
}

#====================================================================================================
getLifecourseVentilationRateMale <- function(age)
  #====================================================================================================
{
  co = getLifecourseCardiacOutputMale(age)
  qp = 0.96*co + 58
  return(qp)
}

#====================================================================================================
getLifecourseVentilationRateFemale <- function(age)
  #====================================================================================================
{
  co = getLifecourseCardiacOutputFemale(age)
  qp = 0.62*co + 82
  return(qp)
}

#'Get the Lung Dead Space for a given age and gender
#' @description Uses life course equation to calculate the lung dead space for a specific age and gender
#' @param age Age in years
#' @param gender Either "M" for Male for "F" for Female
#' @export
getLifecourseLungDeadSpace<- function(age,gender){
  if(is.na(age)) return(NA)

  if(gender == "M"){
    return(getLifecourseLungDeadSpaceMale(age))
  }else if(gender == "F"){
    return(getLifecourseLungDeadSpaceFemale(age))
  }
}

#=========
getLifecourseLungDeadSpaceMale <- function(age){
  return(0.17*exp(log(0.01371/0.17)*exp(-0.13*age)))
}

#=========
getLifecourseLungDeadSpaceFemale <- function(age){
  return(0.1274*exp(log(0.01345/0.1274)*exp(-0.1609*age)))
}

#' Get the tidal volume for a given age and gender
#' @description Uses life course equation to calculate the tidal volume for a specific age and gender
#' @param age Age in years
#' @param gender Either "M" for Male for "F" for Female
#' @param activity Activity level. Can be "rest" or "light activity"
#' @export
getLifecourseTidalVolume <- function(age,gender,activity ="rest"){
  if(is.na(age)) return(NA)

  if (gender=="M"){
    return(getLifecourseTidalVolumeMale(age,activity))
  }else if(gender=="F"){
    return(getLifecourseTidalVolumeFemale(age,activity))
  }
}

#======
getLifecourseTidalVolumeMale<- function(age,activity){
  if (activity == "rest"){
    return(0.6842*exp(log(0.04306/0.6842)*exp(-0.1357*age)))
  }else if(activity == "light exercise"){
    if(age <= 1){
      return(1.661*exp(log(0.07428/1.661)*exp(-0.1095*age)))
    }else{
      return(0.1041+(age^2.727)*(1.478-0.1041)/(age^2.727+12.23^2.727))
    }
  }
}
#=======
getLifecourseTidalVolumeFemale<- function(age,activity){
  if (activity == "rest"){
    return(0.02712+(age^0.9173)*(0.9599-0.02712)/(age^0.9173+27.01^0.9173))
  }else if(activity == "light exercise"){
    if (age <= 1){
      return(1.159*exp(log(0.07248/1.159)*exp(-0.1362*age)))
    }else{
      return(0.1036+(age^3.064)*(1.055-0.1036)/(age^3.064+9.58^3.064))
    }
  }
}

#' Get the urine production rate for a given age and gender
#' @description Uses life course equation to calculate a urine production rate for a specific age and gender
#' @param age Age in years
#' @param gender Either "M" for Male for "F" for Female
#' @export
getLifecourseUrineProductionRate <- function(age, gender)
#====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseUrineProductionRateMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseUrineProductionRateFemale(age))
  }
}

#====================================================================================================
getLifecourseUrineProductionRateMale <- function(age)
  #====================================================================================================
{
  ur = -2.96538E-06*age^4 + 7.71852E-04*age^3 - 7.54327E-02*age^2 + 3.04687E+00*age + 1.26931E+01
  return(ur)
}

#====================================================================================================
getLifecourseUrineProductionRateFemale <- function(age)
#====================================================================================================
{
  ur = 1.59275E-04*age^3 - 3.09917E-02*age^2 + 1.70013E+00*age + 2.07921E+01
  return(ur)
}

#' Get the Glomerular Filteration Rate for a given age and gender
#' @description Uses life course equation to calculate a GFR for a specific age and gender
#' @param age Age in years
#' @param gender Either "M" for Male for "F" for Female
#' @export
getLifecourseGlomerularFiltrationRate <- function(age, gender)
  #====================================================================================================
{
  if(is.na(age)) return(NA)

  if(gender == "M") {
    return(getLifecourseGlomerularFiltrationRateMale(age))
  }
  else if(gender == "F") {
    return(getLifecourseGlomerularFiltrationRateFemale(age))
  }
}

#====================================================================================================
getLifecourseGlomerularFiltrationRateMale <- function(age)
#====================================================================================================
{
  gfr = NA

  bw     = getLifecourseBodyWeightMale(age)
  mbw10d = getLifecourseBodyWeightMale(1/365)
  mbw1   = getLifecourseBodyWeightMale(1)

  bsa    = getLifecourseBodySurfaceAreaMale(age)
  bsa1   = getLifecourseBodySurfaceAreaMale(1)
  bsa30  = getLifecourseBodySurfaceAreaMale(30)


  gfr_bsa = 7.62

  days = age/365

  if(age >= 0 && age <= 1/365)  # 1 day
  {
    gfr = 0.12 * (1.0 + 1.0) * (-0.0013 * mbw10d**2.0 + 0.2025 * mbw10d - 0.1363) * (gfr_bsa * bsa1 / 1.73) / ((-0.0013 * mbw1**2.0 + 0.2025 * mbw1 - 0.1363) * (0.48 + (0.0571 * (10.0 - 3.0))))
  }
  else if (age > 1/365 && age <= 3/365) # 3 days
  {
    gfr = 0.12 * (1.0 + days) * (-0.0013 * mbw10d**2.0 + 0.2025 * mbw10d - 0.1363) * (gfr_bsa * bsa1 / 1.73) / ((-0.0013 * mbw1**2.0 + 0.2025 * mbw1 - 0.1363) * (0.48 + (0.0571 * (10.0 - 3.0))))
  }
  else if (age > 3/365 && age <= 10/365) # 10 days
  {
    gfr = (0.48 + (0.0571 * (days - 3))) * (-0.0013 * mbw10d**2.0 + 0.2025 * mbw10d - 0.1363) * (gfr_bsa * bsa1 / 1.73) / ((-0.0013 * mbw1**2.0 + 0.2025 * mbw1 - 0.1363) * (0.48 + (0.0571 * (10.0 - 3.0))))
  }
  else if (age > 10/365 && age <= 1)
  {
    gfr = (-0.0013 * bw**2.0 + 0.2025 * bw - 0.1363) * (gfr_bsa * bsa1 / 1.73) / (-0.0013 * mbw1**2.0 + 0.2025 * mbw1 - 0.1363)
  }
  else if (age > 1 && age <= 30)
  {
    gfr = gfr_bsa * bsa / 1.73
  }
  else if (age > 30)
  {
    gfr = gfr_bsa * bsa30 / 1.73 - (0.0066 * (7.62 * bsa30 / 1.73) * (age - 30))
  }

  return(gfr)
}

#====================================================================================================
getLifecourseGlomerularFiltrationRateFemale <- function(age)
#====================================================================================================
{
  gfr = NA

  bw     = getLifecourseBodyWeightFemale(age)
  mbw10d = getLifecourseBodyWeightFemale(1/365)
  mbw1   = getLifecourseBodyWeightFemale(1)

  bsa    = getLifecourseBodySurfaceAreaFemale(age)
  bsa1   = getLifecourseBodySurfaceAreaFemale(1)
  bsa30  = getLifecourseBodySurfaceAreaFemale(30)


  gfr_bsa = 7.62

  days = age/365

  if(age >= 0 && age <= 1/365)  # 1 day
  {
    gfr = 0.12 * (1.0 + 1.0) * (-0.0013 * mbw10d**2.0 + 0.2025 * mbw10d - 0.1363) * (gfr_bsa * bsa1 / 1.73) / ((-0.0013 * mbw1**2.0 + 0.2025 * mbw1 - 0.1363) * (0.48 + (0.0571 * (10.0 - 3.0))))
  }
  else if (age > 1/365 && age <= 3/365) # 3 days
  {
    gfr = 0.12 * (1.0 + days) * (-0.0013 * mbw10d**2.0 + 0.2025 * mbw10d - 0.1363) * (gfr_bsa * bsa1 / 1.73) / ((-0.0013 * mbw1**2.0 + 0.2025 * mbw1 - 0.1363) * (0.48 + (0.0571 * (10.0 - 3.0))))
  }
  else if (age > 3/365 && age <= 10/365) # 10 days
  {
    gfr = (0.48 + (0.0571 * (days - 3))) * (-0.0013 * mbw10d**2.0 + 0.2025 * mbw10d - 0.1363) * (gfr_bsa * bsa1 / 1.73) / ((-0.0013 * mbw1**2.0 + 0.2025 * mbw1 - 0.1363) * (0.48 + (0.0571 * (10.0 - 3.0))))
  }
  else if (age > 10/365 && age <= 1)
  {
    gfr = (-0.0013 * bw**2.0 + 0.2025 * bw - 0.1363) * (gfr_bsa * bsa1 / 1.73) / (-0.0013 * mbw1**2.0 + 0.2025 * mbw1 - 0.1363)
  }
  else if (age > 1 && age <= 30)
  {
    gfr = gfr_bsa * bsa / 1.73
  }
  else if (age > 30)
  {
    gfr = gfr_bsa * bsa30 / 1.73 - (0.0062 * (7.62 * bsa30 / 1.73) * (age - 30))
  }

  return(gfr)
}
sahu27/sahu documentation built on May 30, 2019, 2:06 a.m.