## ----echo=FALSE, message=FALSE------------------------------------------------
knitr::opts_chunk$set(collapse = TRUE, comment = "#>", warning = FALSE, message = FALSE)

## ----results="hide"-----------------------------------------------------------
# Load the RDML package and use its functions to `extract` the required data
library(RDML7)
filename <- system.file("extdata/stepone_std.rdml", package="RDML7")
raw_data <- readRDML(filename)

## -----------------------------------------------------------------------------
raw_data$target[["RNase P"]]$amplificationEfficiency

## -----------------------------------------------------------------------------
names(raw_data$experiment[["Standard Curve Example"]]$run$Run001)
raw_data$experiment[["Standard Curve Example"]]$run$Run001$instrument
raw_data$experiment[["Standard Curve Example"]]$run$Run001$pcrFormat

## -----------------------------------------------------------------------------
fdata <- 
  asTable(raw_data,
          # Custom name pattern
          namePattern = "{position}:{sample}~{sampleType}~{target}") |> 
  # Get all fluorescence data
  getFData(raw_data, request = _, long.table=FALSE)

## -----------------------------------------------------------------------------
# Load the ggplot2 package for plotting
library(ggplot2)
# Load the reshape2 package to rearrange the data
library(reshape2)
# Rearrange and plot the raw data
fdata_gg <- melt(fdata, id.vars="cyc")
ggplot(data=fdata_gg, aes(x=cyc, y=value, color=variable)) + 
    geom_line() + labs(x="Cycle", y="RFU") + theme_light() +
    theme(legend.position="top",
    legend.direction="horizontal")


## ----echo=TRUE, include=TRUE--------------------------------------------------
# Write a custom function that calculates the Cq values and other curve parameters
library(qpcR)
res_fit <- do.call(cbind, lapply(2L:ncol(fdata), function(block_column) {
    
    res_model <- try(mselect(pcrfit(data=fdata, cyc=1, fluo=block_column), verbose=FALSE, do.all=TRUE), silent=TRUE)
    if(class(res_model)[1] == "try-error") {
        res_model <- NA
    }
    else{
        try(efficiency(res_model, plot=FALSE, type="Cy0"), silent=TRUE)
    }
        }
    )
)
# Assign column names
colnames(res_fit) <- colnames(fdata)[-1]

# Fetch only the Cq values (second derivative maximum) and combine them in a
# data.frame

Cq_SDM <- res_fit[rownames(res_fit)=="cpD2", ] |> 
  unlist() |> 
  as.data.frame()
colnames(Cq_SDM) <- c("Cq")

# Prepare the dilutions and calculated Cq values for further usage in the effcalc
# function from the chipPCR package

dilution <- c(as.factor("ntc"), as.factor("unk"), as.factor("unk"),
              10000, 5000, 2500, 1250, 625)
Cq_values <- matrix(Cq_SDM[, "Cq"], nrow=length(dilution), ncol=3, byrow=TRUE)

## ----results="asis", echo=FALSE-----------------------------------------------
knitr::kable(res_fit[, c(1, 5)], caption="Selected data of calculated values 
from the fitted models. The values reported in the table were calculated by a 
chain of functions from the **qpcR** package. In detail, this were the *mselect* 
function to calculate the optimal multiparametric sigmoid model and the 
*efficiency* function to calculate the Cq values and other curve parameters. 
More information about these functions is available from the manual of the 
**qpcR** package. The samples `A01` (ntc, non-template cntrol) and 
`A05` (unk, unknown) were arbitrarily selected for 
presentation. The custom made function assigned a NA (not available) to sample 
`A01` because no Cq value or other curve 
parameters could be calculated from the non-template control.")

## ----echo=TRUE----------------------------------------------------------------
# Load the chipPCR package
library(chipPCR)

# Use the effcalc function from the chipPCR package to calculate the amplification
# efficiency and store the results in the object res_efficiency

res_efficiency <- effcalc(dilution[-c(1:3)], Cq_values[-c(1:3), ], logx=TRUE)

# Use the %>% function from the magrittr package to plot the results (res_efficiency) 
# from the effcalc function 

res_efficiency |> plot(CI=TRUE, ylab="Cq (SDM)", 
                        main="Second Derivative Maximum Method")

## ----results="asis"-----------------------------------------------------------
# Combine the sample labels and the Cq values as calculate by the Second 
# Derivative Maximum Method (cpD2).

sample_Cq <- data.frame(sample=c("ntc", "unk", "unk", 
                                 10000, 5000, 2500, 1250, 625), 
                        Cq_values)

# Print table of all Cq values
# Use the kable function from the knitr package to print a table

knitr::kable(sample_Cq, caption="Cq values as calculate by the Second Derivative 
Maximum Method (cpD2). ntc, non-template control. unk, unknown sample. X1, X2 
and X3 are the Cq values from a triplicate measurement.")

## ----results="asis"-----------------------------------------------------------
knitr::kable(res_efficiency, caption="Analysis of the amplification efficiency. 
The table reports the concentration-depentent average Cq values from three 
replicates per dilution step. In addition, the standard deviation (SD) and the 
Coefficient of Variation (RSD [%]) are presented. The results indicate that the 
data basis for the calibration curve is valid.")

