---
title: "Quality Control"
date: "`r BiocStyle::doc_date()`"
package: sesame
output: BiocStyle::html_document
fig_width: 6
fig_height: 5
vignette: >
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteIndexEntry{1. Quality Control}
  %\VignetteEncoding{UTF-8}
---

```{r message=FALSE, warning=FALSE, results="hide"}
library(sesame)
sesameDataCache()
```

# Calculate Quality Metrics

The main function to calculate the quality metrics is `sesameQC_calcStats`.
This function takes a SigDF, calculates the QC statistics, and returns a single
S4 `sesameQC` object, which can be printed directly to the console. To calculate
QC metrics on a given list of samples or all IDATs in a folder, one can use
`sesameQC_calcStats` within the standard `openSesame` pipeline. When used with
`openSesame`, a list of `sesameQC`s will be returned. Note that one should turn
off preprocessing using `prep=""`:

```{r qc1, eval=FALSE}
## calculate metrics on all IDATs in a specific folder
qcs = openSesame(idat_dir, prep="", func=sesameQC_calcStats)
```

SeSAMe divides sample quality metrics into multiple groups. These groups are
listed below and can be referred to by short keys. For example, "intensity"
generates signal intensity-related quality metrics.

```{r echo=FALSE}
library(knitr)
kable(data.frame(
    "Short Key" = c(
        "detection",
        "numProbes",
        "intensity",
        "channel",
        "dyeBias",
        "betas"),
    "Description" = c(
        "Signal Detection",
        "Number of Probes",
        "Signal Intensity",
        "Color Channel",
        "Dye Bias",
        "Beta Value")))
```

By default, `sesameQC_calcStats` calculates all QC groups. To save time, one
can compute a specific QC group by specifying one or multiple short keys in
the `funs=` argument:

```{r qc2}
sdfs <- sesameDataGet("EPIC.5.SigDF.normal")[1:2] # get two examples
## only compute signal detection stats
qcs = openSesame(sdfs, prep="", func=sesameQC_calcStats, funs="detection")
qcs[[1]]
```

> We consider signal detection the most important QC metric.

One can retrieve the actual stat numbers from `sesameQC` using the
sesameQC_getStats (the following generates the fraction of probes with
detection success):

```{r qc3}
sesameQC_getStats(qcs[[1]], "frac_dt")
```

After computing the QCs, one can optionally combine the `sesameQC` objects into
a data frame for easy comparison.

```{r qc4}
## combine a list of sesameQC into a data frame
head(do.call(rbind, lapply(qcs, as.data.frame)))
```

Note that when the input is an `SigDF` object, calling `sesameQC_calcStats`
within `openSesame` and as a standalone function are equivalent.

```{r qc5, message=FALSE}
sdf <- sesameDataGet('EPIC.1.SigDF')
qc = openSesame(sdf, prep="", func=sesameQC_calcStats, funs=c("detection"))
## equivalent direct call
qc = sesameQC_calcStats(sdf, c("detection"))
qc
```

# Rank Quality Metrics

```{r qc6, echo=FALSE}
options(rmarkdown.html_vignette.check_title = FALSE)
```

SeSAMe features comparison of your sample with public data sets. The
`sesameQC_rankStats()` function ranks the input `sesameQC` object with
`sesameQC` calculated from public datasets. It shows the rank percentage of the
input sample as well as the number of datasets compared.

```{r qc7}
sdf <- sesameDataGet('EPIC.1.SigDF')
qc <- sesameQC_calcStats(sdf, "intensity")
qc
sesameQC_rankStats(qc, platform="EPIC")
```

# Quality Control Plots

SeSAMe provides functions to create QC plots. Some functions takes sesameQC as
input while others directly plot the SigDF objects. Here are some examples:

- `sesameQC_plotBar()` takes a list of sesameQC objects and creates bar
plot for each metric calculated.

- `sesameQC_plotRedGrnQQ()` graphs the dye bias between the two color channels.

- `sesameQC_plotIntensVsBetas()` plots the relationship between $\beta$ values
  and signal intensity and can be used to diagnose artificial readout and
  influence of signal background.

- `sesameQC_plotHeatSNPs()` plots SNP probes and can be used to detect sample
  swaps.

More about quality control plots can be found in [Supplemental
Vignette](https://zhou-lab.github.io/sesame/v1.16/supplemental.html#qc).

# Session Info

```{r}
sessionInfo()
```
