---
title: "Play with compartment properties"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Play with compartment properties}
  %\VignetteEncoding{UTF-8}
  %\VignetteEngine{knitr::rmarkdown}
editor_options: 
  chunk_output_type: console
---

```{r, echo=FALSE, warning=FALSE, message=FALSE, results='hide'}
EXPORT_PNG <- FALSE
```

### Prerequisite

For this vignette, please load the `campsismod` package and load the minimalist model that we have created in the first vignette.

```{r echo=TRUE, warning=FALSE, message=FALSE}
library(campsismod)
model <- read.campsis("resources/minimalist_model/")
```

### Create new compartment properties

Let's invent a very basic scenario: we would like to infuse `1000` into the central compartment with a fixed rate of `100` and a fixed lag time of `2`.    
First, we're going to delete the initial condition that we had in the minimalist model. This is done as follows:

```{r}
model_ <- model %>% delete(InitialCondition(compartment=1))
model_
```

This is strictly equal as doing (if you prefer working with compartment names):

```{r}
model <- model %>% delete(InitialCondition(compartment= model %>% get_compartment_index("CENTRAL")))
```

We can now add a fixed rate for all infusions that go into the central compartment:

```{r}
model <- model %>% add(InfusionRate(compartment=1, "100"))
```

Finally, let's now add a constant lag time:

```{r}
model <- model %>% add(LagTime(compartment=1, "2"))
```

OK, this is how our model looks like now:

```{r}
model
```

### Simulate our model

Let's now simulate a few individuals and show `A_CENTRAL`, i.e., the amount of drug in the central compartment.

First, we need to define an infusion of `1000` in a Campsis dataset, as well as the observations times.

```{r, eval=EXPORT_PNG}
library(campsis)
dataset <- Dataset(5) %>% 
  add(Infusion(time=0, amount=1000)) %>%
  add(Observations(seq(0,36,by=0.5)))
```

Then, we can run the simulation.

```{r, eval=EXPORT_PNG}
results <- model %>% simulate(dataset=dataset, seed=1)
spaghettiPlot(results, "A_CENTRAL")
```

```{r, eval=EXPORT_PNG, echo=FALSE, results='hide'}
ggplot2::ggsave(filename="resources/minimalist_example_cmt_properties.png", width=7, height=3, dpi=100)
```

![](resources/minimalist_example_cmt_properties.png)

### A couple of useful functions in action

As previously, let's demonstrate the use of a couple of interesting functions:  

Check the existence of a compartment:

```{r}
model %>% contains(Compartment(1)) 
# Or equivalenty:
model %>% contains(Compartment(model %>% get_compartment_index("CENTRAL")))
```

Check the existence of a property:

```{r}
model %>% contains(InfusionRate(1))
model %>% contains(InfusionDuration(1)) 
```

Find a compartment:

```{r}
model %>% find(Compartment(1)) 
```

Find a compartment property:

```{r}
model %>% find(InfusionRate(1)) 
```

Replace a compartment property:

```{r}
model %>% replace(InfusionRate(1, "200")) # Previous value of 100 is overridden
```

Interestingly, the name of a compartment can be replaced as follows:

```{r}
model %>% replace(Compartment(1, name="CENT")) %>%
  delete(Ode("A_CENTRAL")) %>%
  add(Ode("A_CENT", "-K*A_CENT"))
```
