---
title: "Import ToxPi GUI Files"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Import ToxPi GUI Files}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

This vignette will show how to load a data file that was saved using the ToxPi Java GUI, which can be downloaded from [here](https://toxpi.github.io/). The ToxPi Java GUI will save data files using file format "C" described in the ToxPi User Manual. This vignette will use the "format_C.csv" file to demonstrate how to import GUI data.

```{r setup}
library(toxpiR)

## Create a tempfile and download 'format_C.csv'
fmtc <- tempfile()
ghuc <- "https://raw.githubusercontent.com"
fmtcUrl <- file.path(ghuc, "ToxPi", "ToxPi-example-files", "main", "format_C.csv")
download.file(url = fmtcUrl, destfile = fmtc, quiet = TRUE)
```

The "format_C.csv" model specification reuses metrics across different slices. 
In general, we do not recommend duplicating inputs across slices, so the user gets a warning when creating a model with duplicate inputs.

```{r}
## Import file into R
gui <- txpImportGui(fmtc)

```

The resulting `list` object contains: `$model`, a `TxpModel` object with the model specifications; `$input`, a `data.frame` containing the data for calculating ToxPi scores; and `$fills`, an array of slice colors for plotting. 

```{r}
gui$model
gui$input
gui$fills
```

We calculate ToxPi scores using the `txpCalculateScores` function, which takes a model and input `data.frame`.
Note that by default the ToxPi GUI does not accept negative values. However, the package keeps them by default. 
To replicate the GUI functionailty, we set `negative.value.handling = "missing"`. 

```{r}
## Calculate ToxPi scores
res <- txpCalculateScores(model = gui$model, input = gui$input, id.var = "Name",negative.value.handling = "missing")

## Overall ToxPi scores
txpScores(res)

## Slice scores
txpSliceScores(res, adjusted = FALSE)
```

A results output similar to that given by the Java GUI can be obtained by combining score components.

```{r}
out <- as.data.frame(res, adjusted = FALSE)
out <- out[order(out$score, decreasing = TRUE), ]
out
```

ToxPi images and overall score rank plot can also be produced.

```{r fig.width = 7}
plot(sort(res), fills = gui$fills)
```

```{r fig.width = 7, fig.height = 4}
plot(res, txpRanks(res))
plot(res, txpRanks(res), labels = 1:10, pch = 16, size = grid::unit(0.75, "char"))
```

The basic clustering methods offered in the Java GUI can also be recreated.

```{r fig.width = 7, fig.height = 5}
## Hierarchical Clustering
hc <- hclust(dist(txpSliceScores(res)), method = 'complete')
plot(hc, hang = -1, labels = txpIDs(res), xlab = 'Name', sub = '')
```

```{r fig.width = 7, fig.height = 5}
## K-Means Clustering, plotted using principal components
nClusters <- 3
km <- kmeans(txpSliceScores(res), nClusters)
pc <- prcomp(txpSliceScores(res))
coord <- predict(pc) * -sum(txpWeights(res))
plot(coord[,1], coord[,2], col = km$cluster, 
     xlab = 'PC1', ylab = 'PC2', pch = 16)
```
