Type: Package
Title: Serology-Based Data Analysis and Visualization
Version: 1.0.0
Description: Data wrangling and cleaning, quality control checks and implementation of machine learning classification algorithm.
License: CC BY 4.0
Encoding: UTF-8
RoxygenNote: 7.3.3
Depends: R (≥ 4.1.0)
Imports: dplyr, drc, forcats, ggplot2, here, janitor, kableExtra, knitr, magrittr, openxlsx, parsnip, purrr, ranger, readr, readxl, rmarkdown, stats, stringr, tidyr, tidyselect, utils, workflows
URL: https://github.com/dionnecargy/SeroTrackR, https://dionnecargy.github.io/SeroTrackR/
BugReports: https://github.com/dionnecargy/SeroTrackR/issues
Suggests: glue, htmltools, httr, jsonlite, shiny.fluent, tidyverse, zoo
VignetteBuilder: knitr
NeedsCompilation: no
Packaged: 2026-03-23 04:28:32 UTC; argyropoulos.d
Author: Dionne Argyropoulos [aut, cre]
Maintainer: Dionne Argyropoulos <argyropoulos.d@wehi.edu.au>
Repository: CRAN
Date/Publication: 2026-03-26 10:00:36 UTC

SeroTrackR: Serology-Based Data Analysis and Visualization

Description

Data wrangling and cleaning, quality control checks and implementation of machine learning classification algorithm.

Author(s)

Maintainer: Dionne Argyropoulos argyropoulos.d@wehi.edu.au

See Also

Useful links:


Check Platform

Description

This function checks the platform the user has input and whether it aligns with the correct format as expected. Will report error if NOT aligned.

Usage

.check_platform(raw_data, platform)

Arguments

raw_data

String with the raw data path.

platform

"magpix" or "bioplex".

Value

TRUE: if platform == file format, ERROR message when platform does not equal file format.

Author(s)

Dionne Argyropoulos

Examples

your_raw_data <- system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR")
.check_platform(raw_data = your_raw_data, platform = "magpix")

Helper function to process bioplex data

Description

Helper function to process bioplex data

Usage

.clean_bioplex(df)

Arguments

df

Output from '.read_luminex.file()'

Value

Cleaned data fame

Author(s)

Dionne Argyropoulos

Examples

your_raw_data <- system.file("extdata", "example_BioPlex_plate1.xlsx", package = "SeroTrackR")
df            <- .read_luminex_file(your_raw_data)
results       <- .clean_bioplex(df)

Helper function to process luminex (Magpix/Intelliflex) data

Description

Helper function to process luminex (Magpix/Intelliflex) data

Usage

.clean_luminex(df, row1, row2)

Arguments

df

Raw luminex file

row1

Leading row to subset

row2

Final row to subset

Value

Cleaned data fame

Author(s)

Dionne Argyropoulos

Examples



your_raw_data <- system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR")
df            <- .read_luminex_file(your_raw_data)
cfg           <- .magpix_version_config("4.2")

row1         <- which(df$xPONENT == "Median")
row2         <- which(df$xPONENT == "Net MFI")

results      <- .clean_luminex(df, row1, row2)



Convert known dilution to mfi from fitted standard curve

Description

Convert dilution to predicted mfi using known standard curve fit.

Usage

.convert_dilution_to_mfi(dilution, params)

Arguments

dilution

Known dilution of samples

params

Known parameters for five parameter logistic fit.

Value

Returns the predicted mfi of a sample with known dilution.

Author(s)

Eamon Conway

Examples

# This function is typically called internally by higher-level workflows.
# Below is a minimal runnable example using dummy parameters.

# Five-parameter logistic model typically expects parameters in the order:
# a, b, c, d, e  (e often log-transformed)
dummy_params <- c(a = 10000, b = 1.2, c = 0.05, d = 50, e = log(0.01))

# Example dilution value
dilution_example <- 0.1

# Predict MFI from the dummy standard curve
.convert_dilution_to_mfi(dilution_example, dummy_params)


Convert mfi to dilution using known standard curve fit.

Description

Convert mfi to dilution using known standard curve fit.

Usage

.convert_mfi_to_dilution(mfi, params, min_relative_dilution)

Arguments

mfi

Known mfi of samples

params

Known parameters for five parameter logistic fit.

min_relative_dilution

Known minimum value of dilution in the standard curve. Relative means setting S1 to a dilution/RAU/concentration of 1.

Value

Returns the dilution of each sample in mfi.

Author(s)

Eamon Conway

Examples

# This function is typically used within larger analysis pipelines.
# Below is a minimal runnable example using dummy values.

# Dummy five-parameter logistic fit parameters:
# a, b, c, d, e  (with e on the log scale)
# Additional placeholders (f, g) included so params[6] and params[7] exist.
dummy_params <- c(a = 10000, b = 1.2, c = 0.05, d = 50, e = log(0.01),
                  f = -5, g = 5)

# Example MFI value
mfi_example <- 1500

# Minimum relative dilution allowed
min_rel_dil <- 1

# Convert MFI to dilution
.convert_mfi_to_dilution(mfi_example, dummy_params, min_rel_dil)

Convert mfi to dilution using known standard curve fit and no bounds

Description

Convert mfi to dilution using known standard curve fit and no bounds unless you are below the asymptote of the standard curve. In this situation we set your value to min_relative_dilution. I dunno argue?

Usage

.convert_mfi_to_dilution_no_bounds(mfi, params, min_relative_dilution)

Arguments

mfi

Known mfi of samples

params

Known parameters for five parameter logistic fit.

min_relative_dilution

Known minimum value of dilution in the standard curve. Relative means setting S1 to a dilution/RAU/concentration of 1.

Value

Returns the dilution of each sample in mfi.

Author(s)

Eamon Conway

Examples

# This function is generally called inside higher-level analysis workflows.
# Below is a minimal self-contained example using dummy values.

# Dummy five-parameter logistic fit parameters:
# a, b, c, d, e  (with e typically supplied on the log scale)
dummy_params <- c(a = 10000, b = 1.2, c = 0.05, d = 50, e = log(0.01))

# Example MFI value
mfi_example <- 1500

# Minimum relative dilution from the standard curve
min_rel_dil <- 1

# Convert MFI to dilution without bounds
.convert_mfi_to_dilution_no_bounds(mfi_example, dummy_params, min_rel_dil)

Convert mfi to dilution using known standard curve fit and no lower bound

Description

Convert mfi to dilution using known standard curve fit and no lower bound unless you are below the asymptote of the standard curve. In this situation we set your value to min_relative_dilution. I dunno argue?

Usage

.convert_mfi_to_dilution_no_lower_bound(mfi, params, min_relative_dilution)

Arguments

mfi

Known mfi of samples

params

Known parameters for five parameter logistic fit.

min_relative_dilution

Known minimum value of dilution in the standard curve. Relative means setting S1 to a dilution/RAU/concentration of 1.

Value

Returns the dilution of each sample in mfi.

Author(s)

Eamon Conway

Examples

# This function is usually called inside higher-level analysis steps.
# Below is a minimal runnable example using dummy values.

# Dummy five-parameter logistic fit parameters:
# a, b, c, d, e  (with e typically on the log scale)
dummy_params <- c(a = 10000, b = 1.2, c = 0.05, d = 50, e = log(0.01), f = 0, g = 5)

# Example MFI value
mfi_example <- 1500

# Minimum relative dilution from the standard curve
min_rel_dil <- 1

# Convert MFI to dilution without applying a lower bound
.convert_mfi_to_dilution_no_lower_bound(mfi_example, dummy_params, min_rel_dil)

Helper function to process luminex sections

Description

Helper function to process luminex sections

Usage

.extract_luminex_sections(df, cfg, plt)

Arguments

df

String with the raw data path.

cfg

Magpix version output of .magpix_version_config().

plt

Platform (magpix, intelliflex)

Value

List of data_raw, results, counts, blanks, stds, run

Author(s)

Dionne Argyropoulos

Examples

your_raw_data <- system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR")
df            <- .read_luminex_file(your_raw_data)
cfg           <- .magpix_version_config("4.2")
section       <- .extract_luminex_sections(df, cfg, "magpix")

Fit a standard curve to known mfi and dilution values.

Description

We wish to convert the standard curve samples to a five parameter logistic curve. This function takes those values and calls optim to determine the fit.

Usage

.fit_standard_curve(mfi, dilution, control = NULL)

Arguments

mfi

Known mfi of samples

dilution

Known dilution of samples

control

Optional list of control parameters for the underlying call to optim.

Value

standard curve log logistic

Author(s)

Eamon Conway

Examples

# This function is typically called within data-processing workflows.
# Workflow-style example (not run on CRAN)



# This block demonstrates how .fit_standard_curve() is typically used
# inside the MFItoRAU_Adj-conversion pipeline.

# Step 1 — Prepare master file (normally from readSeroData)
master_file <- data.frame(
  Location = c("A1","A2","A3"),
  Sample   = c("S1","S2","S3"),
  Plate    = c("Plate1","Plate1","Plate1"),
  Ag1 = c(12000, 8000, 4000),
  Ag2 = c(9000,  5000, 2500)
)

# Convert antigen columns to numeric
L <- master_file |>
  dplyr::mutate(dplyr::across(-c(Location, Sample, Plate), as.numeric))

# Fake plate layout (normally from readPlateLayout)
layout <- list(Plate1 = data.frame(Location = c("A1","A2","A3"), WellType = "STD"))


# Step 2 — Load reference standard curve MFI values (dummy data)
refs <- data.frame(
  std_plate = rep("StdPlate1", 5),
  antigen   = rep("Ag1", 5),
  dilution  = c(1, 1/2, 1/4, 1/8, 1/16),
  eth_mfi   = c(14000, 7000, 3500, 1800, 900),
  png_mfi   = c(15000, 7600, 3800, 1900, 950)
)


# Step 3 — Define optimisation settings
control <- list(
  maxit  = 10000,
  abstol = 1e-8,
  reltol = 1e-6
)


# Step 4 — Fit ETH and PNG curves per standard-plate × antigen
ref_fit <- refs |>
  dplyr::group_by(.data$std_plate, .data$antigen) |>
  tidyr::nest() |>
  dplyr::mutate(
    eth_fit = purrr::map(data, ~ .fit_standard_curve(.x$eth_mfi, .x$dilution, control)),
    png_fit = purrr::map(data, ~ .fit_standard_curve(.x$png_mfi, .x$dilution, control))
  )

ref_fit


Helper function to identify Magpix version

Description

Helper function to identify Magpix version

Usage

.magpix_version_config(version)

Arguments

version

String with the raw data path.

Value

specific column names for filtering for xPONENT software v4.2 and v4.3

Author(s)

Dionne Argyropoulos

Examples

version = "4.2"
.magpix_version_config(version)


Helper function to add Sample IDs to output.

Description

Helper function to add Sample IDs to output.

Usage

.merge_mfitorau(df, layout, plate_level)

Arguments

df

Data frame following 5-parameter logistic function applied.

layout

Output from 'readPlateLayout()'.

plate_level

Specific plate of interest.

Value

Processed data frame with correct Sample IDs.

Author(s)

Dionne Argyropoulos


Helper function to process bioplex sections

Description

Helper function to process bioplex sections

Usage

.post_process_bioplex(df)

Arguments

df

Output from '.read_luminex_file()'

Value

List of data_raw, results, counts, blanks, stds, run

Author(s)

Dionne Argyropoulos

your_raw_data <- system.file("extdata", "example_BioPlex_plate1.xlsx", package = "SeroTrackR") df <- .read_luminex_file(your_raw_data) sections <- .post_process_bioplex(df)


Helper function to process luminex into master_list

Description

Helper function to process luminex into master_list

Usage

.post_process_luminex(sections, file_name, master_list)

Arguments

sections

Output from '.post_process_bioplex()'.

file_name

User input file name.

master_list

Intermediary df from 'readSeroData()'.

Value

List of data_raw, results, counts, blanks, stds, run

Author(s)

Dionne Argyropoulos


Helper function to fit a 5-parameter logistic standard curve to dilutions

Description

Helper function to fit a 5-parameter logistic standard curve to dilutions

Usage

.process_antigen_loglog(
  subset_data,
  antigen,
  dilution,
  s1_concentration,
  s_final_concentration,
  unknown_letters = c("U", "X")
)

Arguments

subset_data

Data for one plate.

antigen

Data for one antigen.

dilution

Set of five or ten.

s1_concentration

Concentration of highest dilution.

s_final_concentration

Concentration lowest dilution.

unknown_letters

Bioplex, Magpix or Intelliflex known unknown letters (Default = U and X).

Value

A list of the model results data frame and model.

Author(s)

Connie Li Wai Suen, Dionne Argyropoulos


Helper function to read raw luminex files

Description

Helper function to read raw luminex files

Usage

.read_luminex_file(file)

Arguments

file

String with the raw data path.

Value

raw data frame

Author(s)

Dionne Argyropoulos

Examples

your_raw_data <- system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR")
df <- .read_luminex_file(your_raw_data)

Relabel column names to Standardised Naming Convention

Description

This is a helper function to be used inside 'readSeroData()' to relabel columns for each plate.

Usage

.relabel_columns(df)

Arguments

df

Data frame from 'readSeroData()' processing.

Value

A data fame with columns renamed

Author(s)

Dionne Argyropoulos

Examples


your_raw_data <- system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR")

if (
 requireNamespace("dplyr", quietly = TRUE) &&
 requireNamespace("janitor", quietly = TRUE)
) {

  # Read in raw luminex file
  df <- .read_luminex_file(your_raw_data)

  # Get the start and end rows of the data section: start = "Median", end = "Net MFI"
  row1    <- which(df$xPONENT == "Median")
  row2    <- which(df$xPONENT == "Net MFI")

  # Apply data processing pipeline, including .relabel_columns()
  df |>
    dplyr::slice((row1 + 1):(row2 - 1)) |>
    janitor::row_to_names(row_number = 1) |>
    dplyr::select(dplyr::where(~ !all(is.na(.x)))) |>
    dplyr::filter(dplyr::if_any(dplyr::everything(), ~ !is.na(.x))) |>
    dplyr::mutate(dplyr::across(everything(), ~ gsub("NaN", 0, .))) |>
    .relabel_columns()
}


Helper function to set up MFI to RAU function

Description

Helper function to set up MFI to RAU function

Usage

.setup_mfitorau_inputs(df, plate_list, std_point)

Arguments

df

Output from 'readSeroData()'.

plate_list

Output from 'readPlateLayout()'.

std_point

Standard Point Curve: 5 = 5-point curve, 10 = 10-point curve, "PvLDH" for LDH specific curve. Default = 10. Value is an integer.

Value

A list of processed sero_data, processed plate layout, antigen names, and parameters for standard curve.

Author(s)

Dionne Argyropoulos

Examples



# Step 0: Load example raw data
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR")
)
your_plate_layout <- system.file(
  "extdata",
  "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Step 1: Read serology data and plate layout
sero_data  <- readSeroData(your_raw_data,"magpix")
plate_list <- readPlateLayout(your_plate_layout, sero_data)

# Step 2: Setup MFI to RAU
setup <- .setup_mfitorau_inputs(
  df = sero_data$results,
  plate_list = plate_list,
  std_point = 10
)




Median Fluorescent Intensity (MFI) to Relative Antibody Units (RAU) conversion

Description

This function fits a 5-parameter logistic standard curve to the dilutions of the positive controls for each protein and converts the MFI values into relative antibody units (RAU) written by Connie Li Wai Suen.

Usage

MFItoRAU(sero_data, plate_list, qc_results, std_point = 10, project = NULL)

Arguments

sero_data

Output from 'readSeroData()'.

plate_list

Output from 'readPlateLayout()'.

qc_results

Output from 'runQC()'.

std_point

Standard Point Curve: 5 = 5-point curve, 10 = 10-point curve, "PvLDH" for LDH specific curve. Default = 10. Value is an integer.

project

Default = NULL. Only write "pkpfpv" if using Pk/Pf/Pv pipeline.

Value

A list of three data frames: 1. Data frame with MFI data, converted RAU data and matched SampleID's. 2. Plot information for 'plotModel' function 3. Data frame of RAU data for random forest classification use.

Author(s)

Dionne Argyropoulos, Connie Li Wai Suen

Examples



# Step 0: Load example raw data
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR")
)
your_plate_layout <- system.file(
  "extdata",
  "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Step 1: Read serology data and plate layout
sero_data  <- readSeroData(your_raw_data,"magpix")
plate_list <- readPlateLayout(your_plate_layout, sero_data)

# Step 2: Process counts and perform quality control
qc_results  <- runQC(sero_data, plate_list)

# Step 3: Convert MFI to RAU
mfi_to_rau <- MFItoRAU(
  sero_data = sero_data,
  plate_list = plate_list,
  qc_results = qc_results
)



Median Fluorescent Intensity (MFI) to Relative Antibody Units (RAU) conversion based on other standard

Description

This function fits a 5-parameter logistic standard curve to the dilutions of the positive controls for each protein and converts the MFI values into relative antibody units (RAU) written by Eamon Conway.

Usage

MFItoRAU_Adj(sero_data, plate_list, qc_results, std_point = 10, project = NULL)

Arguments

sero_data

Output from 'readSeroData()'.

plate_list

Output from 'readPlateLayout()'.

qc_results

Output from 'runQC()'.

std_point

Standard Point Curve: 5 = 5-point curve, 10 = 10-point curve, "PvLDH" for LDH specific curve. Default = 10. Value is an integer.

project

Default = NULL. Only write "pkpfpv" if using Pk/Pf/Pv pipeline.

Value

A list of three data frames: 1. Data frame with MFI data, converted RAU data and matched SampleID's. 2. Plot information for 'plotModel' function. 3. Data frame of RAU data for random forest classification use.

Author(s)

Eamon Conway, Dionne Argyropoulos

Examples



# Step 0: Load example raw data
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR")
)
your_plate_layout <- system.file(
  "extdata",
  "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Step 1: Read serology data and plate layout
sero_data  <- readSeroData(your_raw_data,"magpix")
plate_list <- readPlateLayout(your_plate_layout, sero_data)

# Step 2: Process counts and perform quality control
qc_results  <- runQC(sero_data, plate_list)

# Step 3: Convert MFI to RAU using ETH beads
mfi_to_rau <- MFItoRAU_Adj(
  sero_data    = sero_data,
  plate_list   = plate_list,
  qc_results   = qc_results
)



Median Fluorescent Intensity (MFI) to Relative Antibody Units (RAU) conversion for LDH

Description

This function fits a 5-parameter logistic standard curve to the dilutions of the positive controls for each protein and converts the MFI values into relative antibody units (RAU).

Usage

MFItoRAU_LDH(sero_data, plate_list, std_point = "PvLDH", file_path = NULL)

Arguments

sero_data

Output from 'readSeroData()' or 'readSeroData()'.

plate_list

Output from 'readPlateLayout()'.

std_point

Standard Point Curve: 5 = 5-point curve, 10 = 10-point curve, "PvLDH" for LDH specific curve. Default = "PvLDH".

file_path

A file path to write the .csv final file. Default: Current working directory.

Value

A data frame containing the MFI and RAU Dilution values for each sample

Author(s)

Connie Li Wai Suen, Caitlin Bourke, Dionne Argyropoulos

Examples


# Example demonstrating multi-plate processing workflow.
# These files are included in the SeroTrackR package under inst/extdata.

your_raw_data <- system.file("extdata", "example_BioPlex_PvLDH_plate1.xlsx", package = "SeroTrackR")

your_plate_layout <- system.file(
  "extdata", "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Read in raw BioPlex data
sero_data <- readSeroData(
  raw_data = your_raw_data,
  platform = "bioplex"
)

# Read matching plate layout
plate_list <- readPlateLayout(
  plate_layout = your_plate_layout,
  sero_data = sero_data
)

# Run MFI to RAU conversion
mfi_outputs <- MFItoRAU_LDH(
  sero_data = sero_data,
  plate_list = plate_list
)

# View All Outputs
mfi_outputs


Median Fluorescent Intensity (MFI) to Relative Antibody Units (RAU) conversion for Pk proteins

Description

This function is utilised in the master function 'MFItoRAU_Plasmo()'.

Usage

MFItoRAU_Pk(processed_Pk, plate_list, std_point, qc_results)

Arguments

processed_Pk

df$Pk of output 'processPkPfPv()'

plate_list

Output of 'readPlateLayout()'

std_point

Standard Point Curve: 5 = 5-point curve, 10 = 10-point curve, "PvLDH" for LDH specific curve. Default = 10. Value is an integer.

qc_results

Output from 'runQC()'.

Value

Data frame with MFI data, converted RAU data and matched SampleID's.

Author(s)

Dionne Argyropoulos, Caitlin Bourke


Median Fluorescent Intensity (MFI) to Relative Antibody Units (RAU) conversion for Pk/Pf/Pv Master Function

Description

This function leverages 'MFItoRAU_Pk()' and 'MFItoRAU()' to create a final MFI to RAU output for Pk/Pf/Pv analyses.

Usage

MFItoRAU_Plasmo(sero_data, plate_list, panel = "panel1", std_point, qc_results)

Arguments

sero_data

Output of 'readserodata_output()'

plate_list

Output of 'readPlateLayout()'

panel

Panel of Pk/Pf/Pv antigens. Default = "panel1" or user provided csv of Antigens and Species.

std_point

Standard Point Curve: 5 = 5-point curve, 10 = 10-point curve, "PvLDH" for LDH specific curve. Default = 10. Value is an integer.

qc_results

Output from 'runQC()'.

Value

A list of three data frames: 1. Data frame with MFI data, converted RAU data, matched SampleID's, all intermediate dilution conversion factors 2. Data frame with only SampleID's, MFI and RAU data 3. Data frame #2 in long-format

Author(s)

Dionne Argyropoulos, Caitlin Bourke

Examples


# Example demonstrating multi-plate 5-standard processing workflow.
# These files are included in the SeroTrackR package under inst/extdata.

your_raw_data_5std <- c(
  system.file("extdata", "example_MAGPIX_pk_5std_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_pk_5std_plate2.csv", package = "SeroTrackR")
)
your_plate_layout_5std <- system.file(
  "extdata", "example_platelayout_pk_5std.xlsx",
  package = "SeroTrackR"
)

# Read in raw MAGPIX data
sero_data <- readSeroData(
  raw_data = your_raw_data_5std,
  platform = "magpix"
)

# Read matching plate layout
plate_list <- readPlateLayout(
  plate_layout = your_plate_layout_5std,
  sero_data = sero_data
)
# Quality control
qc_results  <- runQC(sero_data, plate_list)

# Run MFI to RAU conversion
mfi_outputs               <- MFItoRAU_Plasmo(
  sero_data = sero_data,
  plate_list = plate_list,
  panel = "panel1",
  std_point = 5,
  qc_results = qc_results
)

# View All Outputs
mfi_outputs


Random Forest Classification

Description

This function classifies unknown samples as recently exposed or not (Note: MFItoRAU() or MFItoRAU_Adj() needs to be run first to convert to RAU).

Usage

classifyResults(
  mfi_to_rau_output,
  algorithm_type = "antibody_model",
  sens_spec = "balanced",
  qc_results,
  project = NULL
)

Arguments

mfi_to_rau_output

Output from 'MFItoRAU()' or 'MFItoRAU_Adj()'.

algorithm_type

User-selected algorithm choice: - "antibody_model" (PvSeroTaT model; default), or - "antibody_model_excLF016" (PvSeroTaT excluding LF016).

sens_spec

User-selected Sensitivity/Specificity threshold: - "balanced" (default), - "85% sensitivity", - "90% sensitivity", - "95% sensitivity", - "85% specificity", - "90% specificity". - "95% specificity".

qc_results

Output from 'runQC()'.

project

Default = NULL. Only write "pkpfpv" if using Pk/Pf/Pv pipeline.

Value

- Data frame with exposure status for every sample. - Summary table with positive/negative results for each threshold.

Author(s)

Lauren Smith, Dionne Argyropoulos

Examples



# Step 0: Load example raw data
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR")
)
your_plate_layout <- system.file(
  "extdata",
  "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Step 1: Read serology data and plate layout
sero_data  <- readSeroData(your_raw_data,"magpix")
plate_list <- readPlateLayout(your_plate_layout, sero_data)

# Step 2: Process counts and perform quality control
qc_results  <- runQC(sero_data, plate_list)

# Step 3: Convert MFI to RAU using ETH beads
mfi_to_rau <- MFItoRAU_Adj(
  sero_data   = sero_data,
  plate_list  = plate_list,
  qc_results  = qc_results
)

# Step 4: Perform Pv classification
pv_classified <- classifyResults(
  mfi_to_rau_output = mfi_to_rau,
  algorithm_type    = "antibody_model",
  sens_spec         = "balanced",
  qc_results        = qc_results
)


Example Serological Dataset: Bioplex PvLDH Plate 1

Description

A dataset containing raw MFI values and metadata from a sample plate run (Bioplex).

Format

A data frame with 103 rows and 15 columns.

Details

This file is stored in inst/extdata

Source

Randomised data


Example Serological Dataset: Bioplex Plate 1

Description

A dataset containing raw MFI values and metadata from a sample plate run (Bioplex).

Format

A data frame with 103 rows and 15 columns.

Details

This file is stored in inst/extdata

Source

Randomised data


Example Serological Dataset: Bioplex Plate 2

Description

A dataset containing raw MFI values and metadata from a sample plate run (Bioplex).

Format

A data frame with 103 rows and 15 columns.

Source

Randomised data


Example Serological Dataset: Bioplex Plate 3

Description

A dataset containing raw MFI values and metadata from a sample plate run (Bioplex).

Format

A data frame with 104 rows and 8 columns.

Details

This file is stored in inst/extdata

Source

Randomised data


Example Serological Dataset: MAGPIX Plate 1 Pk Analysis 10-Point Standard Curve A dataset containing raw MFI values and metadata from a sample plate run (MAGPIX).

Description

This file is stored in inst/extdata

Format

A data frame with 614 rows and 17 columns.

Source

Randomised data


Example Serological Dataset: MAGPIX Plate 2 Pk Analysis 10-Point Standard Curve

Description

A dataset containing raw MFI values and metadata from a sample plate run (MAGPIX).

Format

A data frame with 614 rows and 17 columns.

Details

This file is stored in inst/extdata

Source

Randomised data


Example Serological Dataset: MAGPIX Plate 1 Pk Analysis 5-Point Standard Curve A dataset containing raw MFI values and metadata from a sample plate run (MAGPIX).

Description

This file is stored in inst/extdata

Format

A data frame with 614 rows and 17 columns.

Source

Randomised data


Example Serological Dataset: MAGPIX Plate 2 Pk Analysis 5-Point Standard Curve

Description

A dataset containing raw MFI values and metadata from a sample plate run (MAGPIX).

Format

A data frame with 614 rows and 17 columns.

Details

This file is stored in inst/extdata

Source

Randomised data


Example Serological Dataset: MAGPIX Plate 1 A dataset containing raw MFI values and metadata from a sample plate run (MAGPIX).

Description

This file is stored in inst/extdata

Format

A data frame with 614 rows and 17 columns.

Source

Randomised data


Example Serological Dataset: MAGPIX Plate 2

Description

A dataset containing raw MFI values and metadata from a sample plate run (MAGPIX).

Format

A data frame with 614 rows and 17 columns.

Details

This file is stored in inst/extdata

Source

Randomised data


Example Serological Dataset: MAGPIX Plate 3

Description

A dataset containing raw MFI values and metadata from a sample plate run (MAGPIX).

Format

A data frame with 614 rows and 17 columns.

Details

This file is stored in inst/extdata

Source

Randomised data


96 Well Plate Example Layout

Description

96 well plate map in a wide format used in the lab. Contains information of actual Sample ID names in each well.

Format

A data frame with 9 rows and 13 variables.

Plate

Contains rows labelled "A" to "H"

1-12

Contains columns labelled "1" to "12"

Details

This file is stored in inst/extdata


10-Point Standard Curve Example Plate Layout

Description

96 well plate map in a wide format used in the lab, used for when 10-point standard curves are required for pk/pf/pv analysis. Contains information of actual Sample ID names in each well.

Format

A data frame with 9 rows and 13 variables.

Plate

Contains rows labelled "A" to "H"

1-12

Contains columns labelled "1" to "12"

Details

This file is stored in inst/extdata


5-Point Standard Curve Example Plate Layout

Description

96 well plate map in a wide format used in the lab, used for when 5-point standard curves are required for pk/pf/pv analysis. Contains information of actual Sample ID names in each well.

Format

A data frame with 9 rows and 13 variables.

Plate

Contains rows labelled "A" to "H"

1-12

Contains columns labelled "1" to "12"

Details

This file is stored in inst/extdata


Get Count Data for each Antigen from the Raw Median Fluorescent Intensity

Description

This function obtains the count data from the raw Median Fluorescent Intensity (MFI). This function relies on the 'readAntigens' and 'readSeroData' data processing functions.

Usage

getAntigenCounts(processed_counts, plate_list)

Arguments

processed_counts

Output from 'processCounts()'.

plate_list

Output from 'readPlateLayout()'.

Value

(i) Data frame providing bead counts per antigen per well per plate. (ii) Designates whether wells should be repeated if there are <= 15 beads (repeat) or if they are sufficient with > 15 beads (sufficient beads).

Author(s)

Dionne Argyropoulos

Examples



# Step 0: Load example raw data
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR")
)
your_plate_layout <- system.file(
  "extdata",
  "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Step 1: Read serology data and plate layout
sero_data  <- readSeroData(your_raw_data,"magpix")
plate_list <- readPlateLayout(your_plate_layout, sero_data)

# Step 2: Process counts and perform quality control
counts      <- processCounts(sero_data)
counts_raw  <- getCounts(counts)
sample_ids  <- getSampleID(counts, plate_list)

# Get Antigen Counts:
antigen_cts <- getAntigenCounts(counts, plate_list)


Get Count Data from Raw Median Fluorescent Intensity

Description

This function obtains the count data from the raw Median Fluorescent Intensity (MFI). This is an interim function used for the plotCounts function. This function relies on the 'readAntigens' and 'readSeroData' data processing functions.

Usage

getCounts(processed_counts)

Arguments

processed_counts

Output from 'processCounts()'.

Value

(i) Data frame providing bead counts per well per plate. (ii) Designates whether wells should be repeated if there are <= 15 beads (repeat) or if they are sufficient with > 15 beads (sufficient beads).

Author(s)

Shazia Ruybal-Pesántez, Dionne Argyropoulos

Examples



# Step 0: Load example raw data
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR")
)
your_plate_layout <- system.file(
  "extdata",
  "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Step 1: Read serology data and plate layout
sero_data  <- readSeroData(your_raw_data,"magpix")
plate_list <- readPlateLayout(your_plate_layout, sero_data)

# Step 2: Process counts and perform quality control
counts      <- processCounts(sero_data)
counts_raw  <- getCounts(counts)


Get All Counts Data

Description

This function obtains the count data from the raw Median Fluorescent Intensity (MFI). This function relies on the output of the Antigen-specific counts ('getAntigenCounts') and the Well or Sample-specific counts ('getCounts').

Usage

getCountsQC(antigen_counts_output, counts_output)

Arguments

antigen_counts_output

Output from 'getAntigenCounts'.

counts_output

Output from 'getCounts'.

Value

Joined data frame for all count data.

Author(s)

Dionne Argyropoulos

Examples



# Step 0: Load example raw data
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR")
)
your_plate_layout <- system.file(
  "extdata",
  "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Step 1: Read serology data and plate layout
sero_data  <- readSeroData(your_raw_data,"magpix")
plate_list <- readPlateLayout(your_plate_layout, sero_data)

# Step 2: Process counts and perform quality control
counts      <- processCounts(sero_data)
counts_raw  <- getCounts(counts)
sample_ids  <- getSampleID(counts, plate_list)
antigen_cts <- getAntigenCounts(counts, plate_list)
counts_qc   <- getCountsQC(antigen_cts, counts_raw)



Get GitHub Version

Description

A short function to obtain the github version from the repository. This is a generalisable function that can be used for any version tags on a repo.

Usage

getGithubRelease(repo_owner, repo_name)

Arguments

repo_owner

GitHub Username

repo_name

GitHub Repository Name

Value

Version tag string

Author(s)

Dionne Argyropoulos

Examples


getGithubRelease(
 repo_owner = "dionnecargy",
 repo_name = "SeroTrackR"
)


Find and create a master plate layout file

Description

Join multiple a plate layout files into one master file with multiple tabs

Usage

getPlateLayout(folder_path = getwd(), output_file = NULL)

Arguments

folder_path

A string containing your main folder for your project or the plate layout files. Default = current working directory.

output_file

A string for the path for your output master file.

Value

An .xlsx file saved to your current working directory with multiple tabs, one tab for each plate layout.

Author(s)

Dionne Argyropoulos

Examples


# Example 1: Create two example 96-well plates in-memory
create_plate <- function(plate_name) {
  rows <- LETTERS[1:8]
  cols <- 1:12
  df <- data.frame(plate = rows)
  for (col in cols) {
    df[[as.character(col)]] <- paste0(rows, col)
  }
  df$plate_id <- plate_name
  df
}

plate1 <- create_plate("Plate1")
plate2 <- create_plate("Plate2")

# Combine plates into a list to simulate getPlateLayout() output
master_layout <- list(
  path = tempfile(fileext = ".xlsx"),  # placeholder path
  data = list(Plate1 = plate1, Plate2 = plate2)
)

# The returned list contains:
# 1. path: the file path to the (simulated) master Excel file
# 2. data: a list of data.frames, one per plate
names(master_layout$data)  # View sheet names

# Example 2: Access individual plates directly
layout_files <- list(plate1, plate2)  # simulate individual Excel sheets

master_layout2 <- list(
  path = tempfile(fileext = ".xlsx"),  # placeholder path
  data = setNames(layout_files, c("Plate1", "Plate2"))
)

# View the resulting plate names
names(master_layout2$data)


Check Beads to Repeat

Description

This function gets the count data and outputs a table of the isolates to repeat or a statement to confirm that none need to be repeated.

Usage

getRepeats(qc_results, plate_list)

Arguments

qc_results

Output from 'runQC()'.

plate_list

Output from 'readPlateLayout()'.

Value

A data frame with wells to "fail", OR if no "fail" found will return text "No repeats necessary".

Author(s)

Dionne Argyropoulos

Examples


# Step 0: Load example raw data and plate layout
raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate3.csv", package = "SeroTrackR")
)
plate_layout <- system.file("extdata", "example_platelayout_1.xlsx", package = "SeroTrackR")

# Step 1: Read data and plate layout
sero_data   <- readSeroData(raw_data, platform = "magpix")
plate_list  <- readPlateLayout(plate_layout, sero_data)

# Step 2: Process counts
qc_results  <- runQC(sero_data, plate_list)

# Step 3: Identify samples to repeat
repeats_table <- getRepeats(
  qc_results = qc_results,
  plate_list = plate_list
)

# View results
repeats_table


Get SampleID from Plate Layout

Description

A helper function to extract Sample ID based on plate name and row/col

Usage

getSampleID(processed_counts, plate_list)

Arguments

processed_counts

Output from 'processCounts()'.

plate_list

Plate name inside of the plate layout file.

Value

Returns the corresponding Sample ID for the correct row/column in the plate layout file. Henceforth "Sample ID" refers to the code in the plate layout file, while "Sample" is the code in the Luminex file.

Author(s)

Dionne Argyropoulos

Examples



# Step 0: Load example raw data
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR")
)
your_plate_layout <- system.file(
  "extdata",
  "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Step 1: Read serology data and plate layout
sero_data  <- readSeroData(your_raw_data,"magpix")
plate_list <- readPlateLayout(your_plate_layout, sero_data)

# Step 2: Process counts and perform quality control
counts      <- processCounts(sero_data)
counts_raw  <- getCounts(counts)
sample_ids  <- getSampleID(counts, plate_list)


Make Card in Fluent UI

Description

This function imports the makes a card following the Fluent UI format.

Usage

makeCard(title, id, content, size = 12, style = "")

Arguments

title

String with the large title that will be printed in the card.

id

Identifying tag for use to link.

content

A list of content to be rendered.

size

A value from 1 to 12 of the width of the screen (default = 12).

style

Value for any css styling.

Value

A "card" in the Fluent UI format with content.

Examples

# Minimal example creating a simple Fluent UI card.
# Safe for CRAN: runs only if shiny.fluent, htmltools, and glue are installed.

if (requireNamespace("shiny.fluent", quietly = TRUE) &&
    requireNamespace("htmltools", quietly = TRUE) &&
    requireNamespace("glue", quietly = TRUE)) {

  # Simple card content
  card_content <- list(
    htmltools::div("This is some example text inside the card.")
  )

  # Create a Fluent UI card
  makeCard(
    title   = "Example Card",
    id      = "example-card",
    content = card_content,
    size    = 6
  )
}

Plot Bead Counts per Plate per Antigen

Description

Enhances the 'plotCounts()' output by providing greater resolution, displaying antigens per plate, and enabling SampleID name visibility via hover (transformed to Plotly in server.R)

Usage

plotBeadCounts(qc_results)

Arguments

qc_results

Output from 'runQC()'.

Value

Dot plot with values > 15 threshold coloured in blue (sufficient beads) and less than or equal to 15 beads coloured in red (repeat) faceted by each antigen (ggplot).

Author(s)

Dionne Argyropoulos

Examples



# Step 0: Load example raw data
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR")
)
your_plate_layout <- system.file(
  "extdata",
  "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Step 1: Read serology data and plate layout
sero_data  <- readSeroData(your_raw_data,"magpix")
plate_list <- readPlateLayout(your_plate_layout, sero_data)

# Step 2: Process counts and perform quality control
qc_results  <- runQC(sero_data, plate_list)

# Step 3: Plot Bead Counts
plotBeadCounts(qc_results)


Plot Raw Median Fluorescent Intensity Blanks Data

Description

This function gets the blank sample data and plots the blank sample Median Fluorescent Intensity (MFI) values.

Usage

plotBlanks(sero_data, experiment_name)

Arguments

sero_data

Output from 'readSeroData()'.

experiment_name

User-input experiment name.

Value

Bar plot showing whether MFI values for the blanks for each antigen per plate is above or below the threshold MFI = 50 (ggplot).

Author(s)

Shazia Ruybal-Pesantez, Dionne Argyropoulos

Examples


# Example demonstrating how to process bead count data.
# These files are included in the SeroTrackR package under inst/extdata.

your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate3.csv", package = "SeroTrackR")
)

# Read in raw MAGPIX data
sero_data <- readSeroData(
  raw_data = your_raw_data,
  platform = "magpix"
)

# Plot blanks
plotBlanks(
  sero_data = sero_data,
  experiment_name = "experiment1"
)




Plot Classification

Description

One example of data visualisation to detect the median and interquartile range of the RAU values per antigen for seropositive and seronegative individuals. Please note that the 'classifyResults()' function must be run first.

Usage

plotBoxPlotClassification(all_classifications, selected_threshold)

Arguments

all_classifications

Data frame of 'classifyResults()' for all sens_spec thresholds.

selected_threshold

String with the threshold.

Value

Box plots with RAU values for each protein stratified by classification (ggplot).

Author(s)

Dionne Argyropoulos

Examples



# Step 0: Load example raw data
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR")
)
your_plate_layout <- system.file(
  "extdata",
  "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Step 1: Read serology data and plate layout
sero_data  <- readSeroData(your_raw_data,"magpix")
plate_list <- readPlateLayout(your_plate_layout, sero_data)

# Step 2: Process counts and perform quality control
qc_results <- runQC(sero_data, plate_list)

# Step 3: Convert MFI to RAU using ETH beads
mfi_to_rau <- MFItoRAU_Adj(
  sero_data    = sero_data,
  plate_list   = plate_list,
  qc_results   = qc_results
)

# Step 4: Define sens/spec thresholds
sens_spec_all <- c(
  "balanced", "85% sensitivity", "90% sensitivity", "95% sensitivity",
  "85% specificity", "90% specificity", "95% specificity"
)

# Step 5: Classify results across all thresholds
all_classifications <- purrr::map_dfr(sens_spec_all, ~{
  classifyResults(
    mfi_to_rau_output = mfi_to_rau,
    algorithm_type = "antibody_model",
    sens_spec = .x,
    qc_results = qc_results
  ) |>
  as.data.frame() |>
  dplyr::mutate(sens_spec = .x)
})

# Plot classification for a single threshold
plotBoxPlotClassification(all_classifications, "balanced")


Plot Bead Count Data

Description

This function gets the count data and plots the plate image, creating a new facet (i.e., panel) for each antigen and each line represents the different plates so that they can be visualised.

Usage

plotCounts(qc_results, experiment_name)

Arguments

qc_results

Output from 'runQC()'.

experiment_name

User-input experiment name.

Value

Tile Plot showing binary result of "sufficient beads" with cut-off >15 beads and "repeat" less than or equal to 15 beads (ggplot).

Author(s)

Shazia Ruybal-Pesántez, Dionne Argyropoulos

Examples



# Step 0: Load example raw data
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR")
)
your_plate_layout <- system.file(
  "extdata",
  "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Step 1: Read serology data and plate layout
sero_data  <- readSeroData(your_raw_data,"magpix")
plate_list <- readPlateLayout(your_plate_layout, sero_data)

# Step 2: Process counts and perform quality control
qc_results  <- runQC(sero_data, plate_list)

# Step 3: Plot Counts
plotCounts(qc_results, "experiment1")


Median Fluorescent Intensity (MFI) Box Plots

Description

Boxplot of the MFI values.

Usage

plotMFI(mfi_to_rau_output, location)

Arguments

mfi_to_rau_output

Output from 'MFItoRAU()' or 'MFItoRAU_Adj()' .

location

"PNG" or "ETH".

Value

Box plots with MFI values for each protein (ggplot).

Author(s)

Dionne Argyropoulos

Examples



# Step 0: Load example raw data
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR")
)
your_plate_layout <- system.file(
  "extdata",
  "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Step 1: Read serology data and plate layout
sero_data  <- readSeroData(your_raw_data,"magpix")
plate_list <- readPlateLayout(your_plate_layout, sero_data)

# Step 2: Process counts and perform quality control
qc_results <- runQC(sero_data, plate_list)

# Step 3: Convert MFI to RAU using ETH beads
mfi_to_rau <- MFItoRAU_Adj(
  sero_data   = sero_data,
  plate_list  = plate_list,
  qc_results  = qc_results
)

# Step 4: Plot MFI values
plotMFI(mfi_to_rau, "MFI")


Plot the Median Fluorescent Intensity (MFI) to Relative Antibody Units (RAU) Results Data

Description

This function gets the Median Fluorescent Intensity (MFI) to Relative Antibody Units (RAU) model results data and plots the model fits based on 'MFItoRAU'.

Usage

plotModel(mfi_to_rau_output, sero_data)

Arguments

mfi_to_rau_output

Output from 'MFItoRAU()'.

sero_data

Output from 'readSeroData()'.

Value

List of dot and line plots of MFI to RAU model standard curve, with each one representing an individual plate (ggplot).

Author(s)

Shazia Ruybal-Pesantez, Dionne Argyropoulos

Examples



# Step 0: Load example raw data
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR")
)
your_plate_layout <- system.file(
  "extdata",
  "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Step 1: Read serology data and plate layout
sero_data  <- readSeroData(your_raw_data,"magpix")
plate_list <- readPlateLayout(your_plate_layout, sero_data)

# Step 2: Process counts and perform quality control
qc_results <- runQC(sero_data, plate_list)

# Step 3: Convert MFI to RAU using ETH beads
mfi_to_rau <- MFItoRAU(
  sero_data = sero_data,
  plate_list = plate_list,
  qc_results = qc_results
)

# Step 4: Plot Model Results
plotModel(mfi_to_rau, sero_data)


Plot the Median Fluorescent Intensity (MFI) to Relative Antibody Units (RAU) Results Data based on ETH standard

Description

This function gets the Median Fluorescent Intensity (MFI) to Relative Antibody Units (RAU) model results data and plots the model fits based on 'MFItoRAU_Adj.'

Usage

plotModel_Adj(mfi_to_rau_output, sero_data)

Arguments

mfi_to_rau_output

Output from 'MFItoRAU_Adj()'.

sero_data

Output from 'readSeroData()'.

Value

List of dot and line plots of MFI to RAU model standard curve, with each one representing an individual plate (ggplot).

Author(s)

Dionne Argyropoulos

Examples



# Step 0: Load example raw data
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR")
)
your_plate_layout <- system.file(
  "extdata",
  "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Step 1: Read serology data and plate layout
sero_data  <- readSeroData(your_raw_data,"magpix")
plate_list <- readPlateLayout(your_plate_layout, sero_data)

# Step 2: Process counts and perform quality control
qc_results <- runQC(sero_data, plate_list)

# Step 3: Convert MFI to RAU using ETH beads
mfi_to_rau <- MFItoRAU_Adj(
  sero_data = sero_data,
  plate_list = plate_list,
  qc_results = qc_results
)

# Step 4: Plot Model Results
plotModel_Adj(mfi_to_rau, sero_data)


Relative Antibody Unit (RAU) Box Plots

Description

Boxplot of the RAU values.

Usage

plotRAU(mfi_to_rau_output, location)

Arguments

mfi_to_rau_output

Output from 'MFItoRAU()' or 'MFItoRAU_Adj()' .

location

"PNG" or "ETH".

Value

Box plots with RAU values for each protein (ggplot).

Author(s)

Dionne Argyropoulos

Examples



# Step 0: Load example raw data
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR")
)
your_plate_layout <- system.file(
  "extdata",
  "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Step 1: Read serology data and plate layout
sero_data  <- readSeroData(your_raw_data,"magpix")
plate_list <- readPlateLayout(your_plate_layout, sero_data)

# Step 2: Process counts and perform quality control
qc_results <- runQC(sero_data, plate_list)

# Step 3: Convert MFI to RAU using ETH beads
mfi_to_rau <- MFItoRAU_Adj(
  sero_data   = sero_data,
  plate_list  = plate_list,
  qc_results  = qc_results
)

# Step 4: Plot RAU values
plotRAU(mfi_to_rau, "ETH")


Plot Raw Median Fluorescent Intensity of Standard Curve Data

Description

This function gets the standards data and plots the standard curves.

Usage

plotStds(sero_data, std_point = 10, location, experiment_name)

Arguments

sero_data

Output from 'readSeroData()'.

std_point

Standard Point Curve: 5 = 5-point curve, 10 = 10-point curve. Default = 10. Value is an integer.

location

"PNG" or "ETH" to filter WEHI standard curve data.

experiment_name

User-input experiment name.

Value

- Dot and line plot of standard curves (S1-S10) with PNG or Ethiopia stds underneath (ggplot). - WEHI-acceptable standard curve data on background of plot with user data.

Author(s)

Dionne Argyropoulos, Shazia Ruybal-Pesantez

Examples


# Example demonstrating how to process bead count data.
# These files are included in the SeroTrackR package under inst/extdata.

your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate3.csv", package = "SeroTrackR")
)

# Read in raw MAGPIX data
sero_data <- readSeroData(
  raw_data = your_raw_data,
  platform = "magpix"
)

# Plot Standards
plotStds(
  sero_data = sero_data,
  location = "ETH",
  experiment_name = "experiment1"
)




Plot Raw Median Fluorescent Intensity of Pk/Pf/Pv Standard Curve Data

Description

This function gets the standards data and plots the standard curves for antigens in the Pk/Pf/Pv panel.

Usage

plotStds_PkPfPv(sero_data, experiment_name, panel = "panel1")

Arguments

sero_data

Output from 'readSeroData()'.

experiment_name

User-input experiment name.

panel

Panel of Pk/Pf/Pv antigens. Default = "panel1" or user provided csv of Antigens and Species.

Value

- Dot and line plot of standard curves (S1-S10) - WEHI-acceptable standard curve data on background of plot with user data.

Author(s)

Dionne Argyropoulos

Examples


# Example demonstrating how to process bead count data.
# These files are included in the SeroTrackR package under inst/extdata.

your_raw_data <- c(
   system.file("extdata", "example_MAGPIX_pk_5std_plate1.csv", package = "SeroTrackR"),
   system.file("extdata", "example_MAGPIX_pk_5std_plate2.csv", package = "SeroTrackR")
)

# Read in raw MAGPIX data
sero_data <- readSeroData(
  raw_data = your_raw_data,
  platform = "magpix"
)

# Plot Standards
plotStds_PkPfPv(
  sero_data = sero_data,
  experiment_name = "experiment1",
  panel = "panel1"
)




Plot Raw Median Fluorescent Intensity of Standard Curve Data

Description

This function gets the standards data and plots the standard curves for any antigens (i.e., non-PvSeroTaT specific).

Usage

plotStds_all(sero_data, experiment_name)

Arguments

sero_data

Output from 'readSeroData()'.

experiment_name

User-input experiment name.

Value

- Dot and line plot of standard curves (S1-S10) - WEHI-acceptable standard curve data on background of plot with user data.

Author(s)

Shazia Ruybal-Pesantez, Dionne Argyropoulos

Examples


# Example demonstrating how to process bead count data.
# These files are included in the SeroTrackR package under inst/extdata.

your_raw_data <- c(
   system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
   system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR"),
   system.file("extdata", "example_MAGPIX_plate3.csv", package = "SeroTrackR")
)

# Read in raw MAGPIX data
sero_data <- readSeroData(
  raw_data = your_raw_data,
  platform = "magpix"
)

# Plot Standards
plotStds_all(
  sero_data = sero_data,
  experiment_name = "experiment1"
)




Process Counts from Raw Serological Data file

Description

A helper function to process counts data.

Usage

processCounts(sero_data)

Arguments

sero_data

Output from 'readSeroData()'.

Value

Returns a long table of counts with "Warning" category (<15 == 1 and >= 15 == 0) for downstream wrangling.

Author(s)

Dionne Argyropoulos

Examples


# Example demonstrating how to process bead count data.
# These files are included in the SeroTrackR package under inst/extdata.

your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate3.csv", package = "SeroTrackR")
)

# Read in raw MAGPIX data
sero_data <- readSeroData(
  raw_data = your_raw_data,
  platform = "magpix"
)

# Process counts
processed_master <- processCounts(sero_data = sero_data)




Processing Serological Data for Pk/Pf/Pv MFI to RAU conversion

Description

This is a pre-requisite function before running the 'MFItoRAU_Plasmo()' so that the appropriate MFI to RAU conversions can be run for the respective antigens.

Usage

processPkPfPv(sero_data, plate_list, panel = "panel1")

Arguments

sero_data

Output of 'readSeroData()'

plate_list

Output of 'readPlateLayout()'

panel

Panel of Pk/Pf/Pv antigens. Default = "panel1" or user provided csv of Antigens and Species.

Value

A list of two data frames: 1. Data frame with Pk antigens 2. Data frame with Pf/Pv antigens

Author(s)

Dionne Argyropoulos

Examples


# Example demonstrating multi-plate 5-standard processing workflow.
# These files are included in the SeroTrackR package under inst/extdata.

your_raw_data_5std <- c(
  system.file("extdata", "example_MAGPIX_pk_5std_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_pk_5std_plate2.csv", package = "SeroTrackR")
)

your_plate_layout_5std <- system.file(
  "extdata", "example_platelayout_pk_5std.xlsx",
  package = "SeroTrackR"
)

# Read in raw MAGPIX data
sero_data <- readSeroData(
  raw_data = your_raw_data_5std,
  platform = "magpix"
)

# Read matching plate layout
plate_list <- readPlateLayout(
  plate_layout = your_plate_layout_5std,
  sero_data = sero_data
)

# Process multi-species panel
processed_master <- processPkPfPv(
  sero_data = sero_data,
  plate_list = plate_list,
  panel = "panel1"
)


Read Plate Layout/s

Description

This function imports the plate layout. Each sheet of the plate layout ".xlsx" file must contain 13 columns (labelled Plate, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) (columns A-M) and 9 rows (Plate, A, B, C, D, E, F, G, H) (rows 1-9). *Note that the first row/column i.e., the A1 cell in excel is called "Plate". This function also checks that the plate sheet labels are consistent with the MAGPIX file input names, as a check prior to merging downstream.

Usage

readPlateLayout(plate_layout, sero_data)

Arguments

plate_layout

An ".xlsx" file with sheets labelled plate1, plate2... etc..

sero_data

Output from 'readSeroData()'.

Value

A list of data frames, with each one representing an individual plate.

Author(s)

Shazia Ruybal-Pesántez, Dionne Argyropoulos

Examples


# Example input files
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate3.csv", package = "SeroTrackR")
)

your_plate_layout <- system.file(
  "extdata",
  "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Step 1: Read and combine serological data
sero_data <- readSeroData(
  raw_data = your_raw_data,
  platform = "magpix"
)
# Step 2: Read plate layout
plate_list <- readPlateLayout(
  plate_layout = your_plate_layout,
  sero_data = sero_data
)

Read Raw Serological Data

Description

This function imports the raw data from the Magpix or Bioplex machine and matches the sample names from the plate layout based on their plate/well location.

Usage

readSeroData(raw_data, platform, version = "4.2", raw_data_filenames = NULL)

Arguments

raw_data

String with the raw data path.

platform

"magpix", "bioplex" or "intelliflex".

version

xPONENT software version. For "magpix" can be 4.2 or 4.3. Default: 4.2.

raw_data_filenames

String with the raw data filename path. Default is NA as it can be deduced from raw_data. Needs to be a parameter for the PvSeroApp.

Value

List of data frames: (i) raw data output, (ii) cleaned all results (iii) count data, (iv) blanks only, (v) standards only, (vi) run information.

Author(s)

Dionne Argyropoulos, Shazia Ruybal-Pesántez

Examples

# Example raw data files (MAGPIX platform)
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate3.csv", package = "SeroTrackR")
)

# Read and combine raw serology data
sero_data <- readSeroData(
  raw_data = your_raw_data,
  platform = "magpix"
)

All Classification Data

Description

This function runs the classification algorithm for all possible sensitivity and specificity options.

Usage

renderClassificationTable(mfi_to_rau_output, algorithm_type, qc_results)

Arguments

mfi_to_rau_output

Output from 'MFItoRAU()' or 'MFItoRAU_Adj()'.

algorithm_type

User-selected algorithm choice: - "antibody_model" (PvSeroTaT model; default), or - "antibody_model_excLF016" (PvSeroTat excluding LF016).

qc_results

Output from 'runQC()'.

Value

A table of all classification outputs.

Author(s)

Dionne Argyropoulos

Examples



# Step 0: Load in Raw Data
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR")
)
your_plate_layout <- system.file("extdata", "example_platelayout_1.xlsx", package = "SeroTrackR")

# Step 1: Reading in Raw Data
sero_data     <- readSeroData(raw_data = your_raw_data, "magpix")
plate_list    <- readPlateLayout(
  plate_layout = your_plate_layout,
  sero_data = sero_data
)

# Step 2: Quality Control and MFI to RAU
qc_results <- runQC(sero_data, plate_list)

# Step 4: Run MFI to RAU (e.g., using ETH beads)
mfi_to_rau_output  <- MFItoRAU_Adj(sero_data, plate_list, qc_results)

# Step 5: Render classification table
renderClassificationTable(
  mfi_to_rau_output = mfi_to_rau_output,
  algorithm_type = "antibody_model",
  qc_results = qc_results
)




Create a Fluent UI Table

Description

This function makes the table in a Fluent UI format.

Usage

renderDetailsList(df)

Arguments

df

Any processed data frame

Value

A table in the Fluent UI format

Author(s)

Dionne Argyropoulos

Examples

# Minimal example using a small data frame.
# This example is safe for CRAN because it runs only if
# shiny.fluent and htmltools are installed.

if (requireNamespace("shiny.fluent", quietly = TRUE) &&
    requireNamespace("htmltools", quietly = TRUE)) {

  # Tiny example data frame
  example_df <- data.frame(
    Sample = c("A", "B"),
    Value = c(10, 20),
    stringsAsFactors = FALSE
  )

  # Render Fluent UI DetailsList
  renderDetailsList(example_df)
}

Generate QC PDF Report

Description

Generate QC PDF Report

Usage

renderQCReport(
  raw_data,
  plate_layout,
  platform,
  experiment_name = "experiment1",
  date = format(Sys.Date(), "%Y%m%d"),
  experiment_notes = "no notes",
  location,
  std_point = 10,
  path = "."
)

Arguments

raw_data

A string with the raw data path.

plate_layout

A string with the plate layout path.

platform

A string: "magpix", "intelliflex", or "bioplex".

experiment_name

A string for experiment name.

date

A string or Date. Defaults to today's date.

experiment_notes

A string of notes. Default is "no notes".

location

A string for experiment location: "ETH" or "PNG" accepted.

std_point

Standard Point Curve: 5 = 5-point curve, 10 = 10-point curve, "PvLDH" for LDH specific curve. Default = 10. Value is an integer.

path

Output path for the PDF file. Defaults to current working directory.

Value

Rendered PDF report.

Author(s)

Dionne Argyropoulos

Examples

## Not run on CRAN because it requires interactive rendering and can be slow:
## Not run: 
  # Example raw data files (MAGPIX platform)
  your_raw_data <- c(
    system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
    system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR"),
    system.file("extdata", "example_MAGPIX_plate3.csv", package = "SeroTrackR")
  )

  # Example plate layout file
  your_plate_layout <- system.file(
    "extdata",
    "example_platelayout_1.xlsx",
    package = "SeroTrackR"
  )

  # Generate the QC PDF report
  renderQCReport(
    raw_data     = your_raw_data,
    plate_layout = your_plate_layout,
    platform     = "magpix",
    location     = "ETH"
  )

## End(Not run)

Render Markdown report

Description

A short function to render the rmarkdown report on Shiny.

Usage

renderReport(input, output, params)

Arguments

input

Input files

output

Output files

params

Parameters to generate outputs.

Value

PDF output.

Author(s)

Dionne Argyropoulos

Examples

# Minimal example that renders a temporary Rmd file.
# Safe for CRAN because it only writes to tempdir()
## Not run: 
if (requireNamespace("rmarkdown", quietly = TRUE) &&
    rmarkdown::pandoc_available()) {

  # Create a temporary Rmd that declares params in the YAML
  rmd_file <- tempfile(fileext = ".Rmd")
  writeLines(c(
    "---",
    "title: \"Test Report\"",
    "output: html_document",
    "params:",
    "  value: 0",
    "---",
    "",
    "This is a test report.",
    "",
    "Parameter value: `r params$value`"
  ), con = rmd_file)

  # Output location
  out_file <- tempfile(fileext = ".html")

  # Example parameters to pass in
  example_params <- list(value = 123)

  # Render report
  renderReport(
    input  = rmd_file,
    output = out_file,
    params = example_params
  )

  # Optionally inspect the output path
  out_file
}

## End(Not run)

Create two columns in Fluent UI

Description

This function creates two columns in the Fluent UI format.

Usage

renderTwoCols(
  first_col,
  second_col,
  first_width = "50%",
  second_width = "50%"
)

Arguments

first_col

A list of content for the first column.

second_col

A list of content for the second column.

first_width

Percent width of the column space (default: 50%).

second_width

Percent width of the column space (default: 50%).

Value

Fluent UI window with two columns.

Author(s)

Dionne Argyropoulos

Examples

# Minimal example using htmltools elements.
# This example runs without starting a Shiny app and is safe for CRAN.

if (requireNamespace("shiny.fluent", quietly = TRUE) &&
    requireNamespace("htmltools", quietly = TRUE)) {

  # Create simple content for each column
  col1 <- list(htmltools::div("First column content"))
  col2 <- list(htmltools::div("Second column content"))

  # Render two columns with default widths
  renderTwoCols(first_col = col1, second_col = col2)
}

Run LDH Pipeline from Start to End

Description

A master function combining the entire LDH pipeline into one command to run in R.

Usage

runLDHPipeline(
  raw_data,
  plate_layout,
  platform = "bioplex",
  dilution = c(1e+06, 333333.33, 111111.11, 37037.04, 12345.68, 4115.23, 1371.74, 457.25,
    152.42, 50.81),
  experiment_name = "experiment1",
  file_path = NULL
)

Arguments

raw_data

String with the raw data path.

plate_layout

An ".xlsx" file with sheets labelled plate1, plate2... etc.

platform

"magpix" or "bioplex". Default: "Bioplex"

dilution

A list of numbers ranging from S1 to S10. Default: 1000000, 333333.33, 111111.11, 37037.04, 12345.68, 4115.23, 1371.74, 457.25, 152.42, 50.81.

experiment_name

User-input experiment name. Default: "experiment1".

file_path

A file path to write the .csv final file. Default: Current working directory.

Value

A data frame containing the MFI and RAU Dilution values for each sample, QC plots for standard curve, bead counts and blanks.

Author(s)

Dionne Argyropoulos

Examples



# Example input files
your_raw_data <- system.file(
  "extdata",
  "example_BioPlex_PvLDH_plate1.xlsx",
  package = "SeroTrackR"
)
your_plate_layout <- system.file(
  "extdata",
  "example_platelayout_1.xlsx",
  package = "SeroTrackR"
)

# Run full LDH processing pipeline
runLDHPipeline(
  raw_data      = your_raw_data,        # Vector of raw data files
  plate_layout  = your_plate_layout,    # Plate layout file
)



Run Pk/Pf/Pv Data Analysis Pipeline from Start to End

Description

Run Pk/Pf/Pv Data Analysis Pipeline from Start to End

Usage

runPlasmoPipeline(
  raw_data,
  platform = "magpix",
  plate_layout,
  panel = "panel1",
  std_point,
  experiment_name = "experiment1",
  classify = "Yes",
  algorithm_type = "antibody_model",
  sens_spec = "balanced"
)

Arguments

raw_data

String with the raw data path.

platform

"magpix" or "bioplex". Default: "Bioplex"

plate_layout

An ".xlsx" file with sheets labelled plate1, plate2... etc.

panel

Panel of Pk/Pf/Pv antigens. Default = "panel1" or user provided csv of Antigens and Species.

std_point

Standard Point Curve: 5 = 5-point curve, 10 = 10-point curve. Value is an integer.

experiment_name

User-input experiment name. Default: "experiment1".

classify

"Yes" or "No" depending on whether you would like classification or not. Default = "Yes".

algorithm_type

User-selected algorithm choice: - "antibody_model" (PvSeroTaT model; default), or - "antibody_model_excLF016" (PvSeroTaT excluding LF016).

sens_spec

User-selected Sensitivity/Specificity threshold: - "balanced" (default), - "85% sensitivity", - "90% sensitivity", - "95% sensitivity", - "85% specificity", - "90% specificity". - "95% specificity".

Value

A data frame containing the MFI and RAU Dilution values for each sample, QC plots for standard curve, bead counts and blanks.

Author(s)

Dionne Argyropoulos

Examples



# Helper to avoid repetition in examples
run_example_std <- function(std_point) {
  # Load raw data for given standard curve
  your_raw_data <- c(
    system.file("extdata",
                paste0("example_MAGPIX_pk_", std_point, "std_plate1.csv"),
                package = "SeroTrackR"),
    system.file("extdata",
                paste0("example_MAGPIX_pk_", std_point, "std_plate2.csv"),
                package = "SeroTrackR")
  )

  layout_file <- system.file(
    "extdata",
    paste0("example_platelayout_pk_", std_point, "std.xlsx"),
    package = "SeroTrackR"
  )

  # Run pipeline
  runPlasmoPipeline(
    raw_data = your_raw_data,
    platform = "magpix",
    plate_layout = layout_file,
    panel = "panel1",
    std_point = std_point,
    experiment_name = paste0(std_point, "-point standard curve")
  )
}

# ---- 5-point standard curve ----
results_5std <- run_example_std(5)

# ---- 10-point standard curve ----
results_10std <- run_example_std(10)



Run PvSero Pipeline from Start to End

Description

A master function combining the entire PvSeroApp pipeline into one command to run in R.

Usage

runPvSeroPipeline(
  raw_data,
  plate_layout,
  platform = "magpix",
  location,
  experiment_name = "experiment1",
  std_point = 10,
  classify = "Yes",
  algorithm_type = "antibody_model",
  sens_spec = "balanced"
)

Arguments

raw_data

String with the raw data path.

plate_layout

An ".xlsx" file with sheets labelled plate1, plate2... etc.

platform

"magpix" or "bioplex". Default = "magpix".

location

"PNG" or "ETH" to filter WEHI standard curve data.

experiment_name

User-input experiment name.

std_point

Standard Point Curve: 5 = 5-point curve, 10 = 10-point curve, "PvLDH" for LDH specific curve. Default = 10. Value is an integer.

classify

"Yes" or "No" depending on whether you would like classification or not. Default = "Yes".

algorithm_type

User-selected algorithm choice: - "antibody_model" (PvSeroTaT model; default), or - "antibody_model_excLF016" (PvSeroTat excluding LF016).

sens_spec

User-selected Sensitivity/Specificity threshold: - "balanced" (default), - "85% sensitivity", - "90% sensitivity", - "95% sensitivity", - "85% specificity", - "90% specificity". - "95% specificity".

Value

classifyResults_output, stdcurve_plot, plateqc_plot, check_repeats_output, blanks_plot, model_plot

Author(s)

Dionne Argyropoulos

Examples



# Example data supplied with the package
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate3.csv", package = "SeroTrackR")
)

plate_layout <- system.file(
  "extdata", "example_platelayout_1.xlsx", package = "SeroTrackR"
)

# Run full pipeline including classification
runPvSeroPipeline(
  raw_data = your_raw_data,
  plate_layout = plate_layout,
  platform = "magpix",
  location = "PNG",
  experiment_name = "experiment1",
  std_point = 10,
  algorithm_type = "antibody_model",
  sens_spec = "balanced",
  classify = "Yes"
)

# Run processing pipeline only (no classification)
runPvSeroPipeline(
  raw_data = your_raw_data,
  plate_layout = plate_layout,
  platform = "magpix",
  location = "PNG",
  experiment_name = "experiment1",
  std_point = 10,
  algorithm_type = "antibody_model",
  sens_spec = "balanced",
  classify = "No"
)


Run Quality Control Pipeline

Description

A master function containing each quality control processing step.

Usage

runQC(sero_data, plate_list)

Arguments

sero_data

Output from 'readSeroData()'.

plate_list

Output from 'readPlateLayout()'.

Value

processCounts_output, getCounts_output, sampleid_output, getAntigenCounts_output, getCountsQC_output

Author(s)

Dionne Argyropoulos

Examples



# Example data supplied with the package
your_raw_data <- c(
  system.file("extdata", "example_MAGPIX_plate1.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate2.csv", package = "SeroTrackR"),
  system.file("extdata", "example_MAGPIX_plate3.csv", package = "SeroTrackR")
)

your_plate_layout <- system.file(
  "extdata", "example_platelayout_1.xlsx", package = "SeroTrackR"
)

# Read serology data and plate layout
sero_data  <- readSeroData(your_raw_data,"magpix")
plate_list <- readPlateLayout(your_plate_layout, sero_data)

# Run full pipeline including classification
runQC(
  sero_data = sero_data,
  plate_list = plate_list
)