| Title: | Read .Q-View Multiplex ELISA Project Files |
|---|---|
| Description: | Pure-R parser for the binary '.Q-View' project file format used in chemiluminescent multiplex ELISA plate imaging and quantification. Reads the embedded H2 database container and CSV report, and returns project metadata, the analyte panel with units and detection limits, sample well-group assignments, per-well pixel-intensity replicates, summary statistics, optional back-calculated concentrations, and a plate layout, all as tidy tibbles. No Java runtime or H2 database driver is required. |
| Authors: | R. Heller [aut, cre, cph] (ORCID: <https://orcid.org/0000-0001-8006-9742>), M. Mannes [aut, cph] (ORCID: <https://orcid.org/0009-0003-4875-8275>) |
| Maintainer: | R. Heller <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 1.0.0 |
| Built: | 2026-07-23 15:56:06 UTC |
| Source: | https://github.com/cran/qviewparsR |
Returns the long-format pixel_intensities table — the primary
tabular data carried by a qview object. To access other slots
(well groups, analyte panel, summary statistics) use qv$<slot>
directly.
## S3 method for class 'qview' as_tibble(x, ...)## S3 method for class 'qview' as_tibble(x, ...)
x |
A |
... |
Unused; for S3 generic compatibility. |
A tibble::tibble() of replicate pixel-intensity readings.
Other qview-methods:
is_qview(),
plot.qview(),
print.qview(),
print.qview_summary(),
summary.qview()
path <- system.file("extdata", "example.Q-View", package = "qviewparsR") qv <- read_qview(path, verbose = FALSE) tibble::as_tibble(qv)path <- system.file("extdata", "example.Q-View", package = "qviewparsR") qv <- read_qview(path, verbose = FALSE) tibble::as_tibble(qv)
qview
is_qview(x)is_qview(x)
x |
An object to test. |
Logical scalar.
Other qview-methods:
as_tibble.qview(),
plot.qview(),
print.qview(),
print.qview_summary(),
summary.qview()
path <- system.file("extdata", "example.Q-View", package = "qviewparsR") is_qview(read_qview(path, verbose = FALSE)) is_qview(list())path <- system.file("extdata", "example.Q-View", package = "qviewparsR") is_qview(read_qview(path, verbose = FALSE)) is_qview(list())
Quick-look plots for a parsed qview object.
## S3 method for class 'qview' plot(x, type = c("plate_map", "intensity_heatmap", "replicate_scatter"), ...)## S3 method for class 'qview' plot(x, type = c("plate_map", "intensity_heatmap", "replicate_scatter"), ...)
x |
A |
type |
One of |
... |
Unused; for S3 generic compatibility. |
"plate_map" – heat-coloured plate map, one cell per well, fill
by well type (standard / negative / sample / control).
"intensity_heatmap" – per-analyte facet, fill by replicate-1
pixel intensity per well.
"replicate_scatter" – replicate 1 vs replicate 2 pixel
intensity per analyte.
Requires the ggplot2 package (Suggested).
A ggplot object.
Other qview-methods:
as_tibble.qview(),
is_qview(),
print.qview(),
print.qview_summary(),
summary.qview()
path <- system.file("extdata", "example.Q-View", package = "qviewparsR") qv <- read_qview(path, verbose = FALSE) plot(qv, type = "plate_map") plot(qv, type = "replicate_scatter")path <- system.file("extdata", "example.Q-View", package = "qviewparsR") qv <- read_qview(path, verbose = FALSE) plot(qv, type = "plate_map") plot(qv, type = "replicate_scatter")
Compact summary of a parsed qview object: project / plate
identifiers, analyte panel, well-group counts by type, and whether
the embedded report carries quantitative concentrations or only
qualitative pixel intensities.
## S3 method for class 'qview' print(x, ...)## S3 method for class 'qview' print(x, ...)
x |
A |
... |
Ignored. |
x, invisibly.
Other qview-methods:
as_tibble.qview(),
is_qview(),
plot.qview(),
print.qview_summary(),
summary.qview()
qv <- read_qview(system.file("extdata", "example.Q-View", package = "qviewparsR"), verbose = FALSE) print(qv)qv <- read_qview(system.file("extdata", "example.Q-View", package = "qviewparsR"), verbose = FALSE) print(qv)
## S3 method for class 'qview_summary' print(x, ...)## S3 method for class 'qview_summary' print(x, ...)
x |
A |
... |
Unused; for S3 generic compatibility. |
x, invisibly.
Other qview-methods:
as_tibble.qview(),
is_qview(),
plot.qview(),
print.qview(),
summary.qview()
path <- system.file("extdata", "example.Q-View", package = "qviewparsR") qv <- read_qview(path, verbose = FALSE) summary(qv)path <- system.file("extdata", "example.Q-View", package = "qviewparsR") qv <- read_qview(path, verbose = FALSE) summary(qv)
qview_app(max_upload_mb = 512, ...)qview_app(max_upload_mb = 512, ...)
max_upload_mb |
Numeric. Maximum upload size per request, in
megabytes. Q-View project files routinely exceed the Shiny upload
default of 5 MB; this argument bumps the limit for the duration of the
running app and restores the previous value on exit. Default
|
... |
Forwarded to |
Interactive front-end for read_qview(). Uploads a .Q-View file
(and optionally an accompanying well-assignment template CSV),
displays the parsed metadata, analytes, well groups, and replicate
tables, and lets the user download the parsed result as xlsx,
rds, or a zip of per-table CSV files.
Requires the shiny, bslib, and DT packages (listed under
Suggests).
Invoked for its side effect of running the app.
if (interactive()) { qview_app() }if (interactive()) { qview_app() }
read_qview( path, strip_prefix = FALSE, verbose = TRUE, call = rlang::caller_env() )read_qview( path, strip_prefix = FALSE, verbose = TRUE, call = rlang::caller_env() )
path |
Character. Path to the |
strip_prefix |
Logical. If |
verbose |
Logical. Print a short summary after parsing.
Default |
call |
The execution environment of the calling function. Used for error reporting; experts only. |
Parses a .Q-View binary container (a chemiluminescent multiplex
ELISA project file holding an embedded H2 database plus binary LOB
segments) and extracts the assay data: project metadata, analyte
panel with units, well-group sample assignments, per-well replicate
pixel intensities, summary statistics, and (when present) the
embedded CSV report.
The file format is reverse-engineered from public binary inspection: it begins with a plain-text manifest, followed by three concatenated H2 database segments. The fully-formatted report Q-View renders for the user is stored as a CLOB inside the main H2 segment. This parser scans the binary for that CLOB, reassembles it across H2 page boundaries (2048-byte pages), and parses it as CSV.
Parsing is done in pure R: no Java runtime, no H2 database driver, no system dependencies beyond a working R installation.
A list with class "qview" containing:
metadataNamed list: project, plate, image,
imager, product, user, report_created, qview_version,
template, container_version, file_path, parsed_at.
manifestTibble with one row per declared file entry
(name, size_bytes, parent).
segmentsTibble of H2 segment byte ranges (segment,
start, end, size).
analytesTibble: spot_number, analyte, unit, plus
lod, lloq, uloq, assay_control_low, assay_control_high
when reported.
well_groupsTibble: well_group, sample_id,
is_standard, is_negative, is_sample, is_control,
well_type.
pixel_intensitiesLong-format tibble of replicate readings:
well_group, sample_id, well, replicate, analyte,
unit, pixel_intensity, dilution.
summary_statisticsLong-format tibble of per-group
averages, std-dev, and CV statistics: well_group, sample_id,
statistic, analyte, value, unit.
concentrationsLong-format concentration tibble or NULL
if the regression model is "Qualitative".
curve_fitTibble with analyte, regression_model, or
NULL if not reported.
report_csvCharacter vector of the raw CSV report lines,
or NULL if no report was generated.
plate_layoutTibble with one row per well: well,
plate_row, plate_col, well_group, sample_id,
well_type, dilution.
strip_qview_prefix(), read_qview_template(),
print.qview(), plot.qview().
Other qview-reader:
read_qview_report(),
read_qview_template()
# A small synthetic .Q-View ships with the package: path <- system.file("extdata", "example.Q-View", package = "qviewparsR") qv <- read_qview(path) qv qv$analytes head(qv$pixel_intensities) if (requireNamespace("ggplot2", quietly = TRUE)) { plot(qv, type = "plate_map") }# A small synthetic .Q-View ships with the package: path <- system.file("extdata", "example.Q-View", package = "qviewparsR") qv <- read_qview(path) qv qv$analytes head(qv$pixel_intensities) if (requireNamespace("ggplot2", quietly = TRUE)) { plot(qv, type = "plate_map") }
read_qview_report( path, strip_prefix = FALSE, verbose = TRUE, call = rlang::caller_env() )read_qview_report( path, strip_prefix = FALSE, verbose = TRUE, call = rlang::caller_env() )
path |
Character. Path to a Q-View report export ( |
strip_prefix |
Logical. If |
verbose |
Logical. Print a short summary after parsing. Default |
call |
The execution environment of the calling function. Used for error reporting; experts only. |
Parses one of the flat report files Q-View exports next to the native
.Q-View container – the ..._auto_report or
..._auto_all-parameters_report export, as either .csv or .xlsx –
and returns the same qview object read_qview() builds
from the binary container. Use it when only the exports were kept and the
original .Q-View project file is unavailable.
The export shares its report layout with the CLOB embedded in the binary
container, so the two readers agree on concentrations and pixel
intensities. Two behaviours differ from read_qview(), both to preserve
information the study workflows rely on:
The plain "Reduced Concentration" point estimate (one row per
sample, the value the exports headline) is captured with
statistic == "reduced". read_qview() currently keeps only the
per-replicate / summary concentration rows.
Out-of-range cells are preserved, not dropped: a "< 52.50"
cell yields concentration = 52.50 with flag = "<", a "> 7700"
cell flag = ">", and an "Incalculable ..." cell
concentration = NA with flag = "incalculable". In-range cells carry
flag = NA.
A list with class "qview", structured as the read_qview()
return value, with these deviations. Container-only slots (manifest,
segments) are zero-row tibbles; metadata$container_version is NA.
The concentrations tibble carries one extra column, flag
(NA / "<" / ">" / "incalculable"), relative to read_qview().
report_csv echoes the full export in file order (metadata preamble,
blank spacer rows, the analyte header, then the data rows), whereas
read_qview()'s report_csv holds only the unique report data lines.
read_qview(), read_qview_template().
Other qview-reader:
read_qview(),
read_qview_template()
path <- system.file("extdata", "example-report.csv", package = "qviewparsR") if (nzchar(path)) { qv <- read_qview_report(path) qv$concentrations }path <- system.file("extdata", "example-report.csv", package = "qviewparsR") if (nzchar(path)) { qv <- read_qview_report(path) qv$concentrations }
read_qview_template(path, verbose = TRUE, call = rlang::caller_env())read_qview_template(path, verbose = TRUE, call = rlang::caller_env())
path |
Path to the template file (csv). |
verbose |
Logical. Print a short summary after parsing.
Default |
call |
The execution environment of the calling function. Used for error reporting; experts only. |
Parses the plate-template CSV that Q-View imports for sample
assignment. The file uses a multi-section layout: an NxM cell in
the top-left declares the plate dimensions, followed by sections
labelled Group Name, Group Type, and Dilution Factor. Each
section is one row per plate row and one column per plate column.
All template data is also embedded inside the .Q-View file itself
(and is recovered by read_qview()); this function exists for
setting up new plates or cross-validating Q-View imports against
the original template.
A tibble::tibble() with one row per well and columns
well (character, e.g. "A1"), plate_row (character, "A"..),
plate_col (integer), sample_id (character), group_type
(character), dilution (numeric).
Other qview-reader:
read_qview(),
read_qview_report()
path <- system.file("extdata", "example-template.csv", package = "qviewparsR") layout <- read_qview_template(path) head(layout)path <- system.file("extdata", "example-template.csv", package = "qviewparsR") layout <- read_qview_template(path) head(layout)
strip_qview_prefix(x)strip_qview_prefix(x)
x |
Character vector of Q-View internal names. |
On import, the producing software prefixes well-assignment template names with single-letter codes:
"Cal 1" ... "Cal N" -> "ICal 1" ... "ICal N" (Internal calibrator)
"Low" -> "GLow"
"High" -> "HHigh"
"FD..." and any all-digit ID -> "N..." (sample prefix)
strip_qview_prefix() reverses this transformation so that downstream
code sees the identifiers exactly as they appear in the original
template CSV. Strings that do not match a known prefix pattern are
returned unchanged.
Character vector of the same length as x, with prefixes
stripped. NAs and unrecognised values pass through unchanged.
Other qview-helper:
well_label()
strip_qview_prefix(c("ICal 1", "GLow", "HHigh", "NFD24277364", "N1211498458", "Plate 1"))strip_qview_prefix(c("ICal 1", "GLow", "HHigh", "NFD24277364", "N1211498458", "Plate 1"))
Per-analyte mean, standard deviation, and coefficient of variation
(sd / mean) of pixel intensities, by well-group type. Calibrator /
standard wells are reported separately so calibration variability is
easy to inspect.
## S3 method for class 'qview' summary(object, ...)## S3 method for class 'qview' summary(object, ...)
object |
A |
... |
Unused; for S3 generic compatibility. |
A tibble::tibble() with one row per well_type x analyte
combination, columns: well_type, analyte, unit, n, mean,
sd, cv, min, max.
Other qview-methods:
as_tibble.qview(),
is_qview(),
plot.qview(),
print.qview(),
print.qview_summary()
path <- system.file("extdata", "example.Q-View", package = "qviewparsR") qv <- read_qview(path, verbose = FALSE) summary(qv)path <- system.file("extdata", "example.Q-View", package = "qviewparsR") qv <- read_qview(path, verbose = FALSE) summary(qv)
well_label(row, col, zero_based = FALSE)well_label(row, col, zero_based = FALSE)
row |
Integer or character. Either a 0/1-based row index or
already a single letter ( |
col |
Integer column index (1-based or 0-based; values >= 1 are treated as 1-based). |
zero_based |
Logical. If |
Converts 0-based or 1-based row and column indices to the standard
"A1" ... "H12" plate notation. Vectorised.
Character vector of well labels (e.g. "A1", "H12"),
recycled to the longer of row / col.
Other qview-helper:
strip_qview_prefix()
well_label(0, 0, zero_based = TRUE) # "A1" well_label(7, 11, zero_based = TRUE) # "H12" well_label("C", 5) # "C5"well_label(0, 0, zero_based = TRUE) # "A1" well_label(7, 11, zero_based = TRUE) # "H12" well_label("C", 5) # "C5"
write_qview_xlsx( qv, path, template = NULL, overwrite = FALSE, call = rlang::caller_env() ) write_qview_csv(qv, path, template = NULL, call = rlang::caller_env()) write_qview_rds(qv, path, overwrite = FALSE, call = rlang::caller_env()) qview_to_xlsx( qv, path, template = NULL, overwrite = FALSE, call = rlang::caller_env() ) qview_to_csv_dir(qv, dir, template = NULL, call = rlang::caller_env())write_qview_xlsx( qv, path, template = NULL, overwrite = FALSE, call = rlang::caller_env() ) write_qview_csv(qv, path, template = NULL, call = rlang::caller_env()) write_qview_rds(qv, path, overwrite = FALSE, call = rlang::caller_env()) qview_to_xlsx( qv, path, template = NULL, overwrite = FALSE, call = rlang::caller_env() ) qview_to_csv_dir(qv, dir, template = NULL, call = rlang::caller_env())
qv |
A |
path |
Output path. For |
template |
Optional plate-template tibble (from
|
overwrite |
Logical. If |
call |
The execution environment of the calling function. Used for error reporting; experts only. |
dir |
Deprecated alias for |
Three writers, one for each common destination. All return the input
qv invisibly so they compose with the pipe.
write_qview_xlsx() – one sheet per parsed table.
write_qview_csv() – one CSV per parsed table inside a directory.
write_qview_rds() – a single .rds containing the full qview
object (lossless, the only round-trippable format).
qv, invisibly, to support pipelines.
path <- system.file("extdata", "example.Q-View", package = "qviewparsR") qv <- read_qview(path, verbose = FALSE) out <- tempfile() dir.create(out) qv |> write_qview_rds(file.path(out, "plate.rds")) |> write_qview_csv(file.path(out, "plate_csv")) list.files(out, recursive = TRUE)path <- system.file("extdata", "example.Q-View", package = "qviewparsR") qv <- read_qview(path, verbose = FALSE) out <- tempfile() dir.create(out) qv |> write_qview_rds(file.path(out, "plate.rds")) |> write_qview_csv(file.path(out, "plate_csv")) list.files(out, recursive = TRUE)