Skip to contents

qviewparsR is a pure-R parser for the binary .Q-View project file format used in chemiluminescent multiplex ELISA plate imaging and quantification. It extracts the embedded report and returns it as tidy tibbles.

No Java runtime, no H2 database driver, no system dependencies beyond a working R installation.

Installation

# install.packages("pak")
pak::pak("CTTIR/qviewparsR")

Quick start

library(qviewparsR)

qv <- read_qview("path/to/project.Q-View")
qv                                # compact summary
qv$analytes                       # spot_number, analyte, unit, lod, lloq, ...
qv$pixel_intensities              # long-format replicate readings
qv$plate_layout                   # one row per well

plot(qv, type = "plate_map")      # plate visualisation (needs ggplot2)
plot(qv, type = "intensity_heatmap")
plot(qv, type = "replicate_scatter")

# Export (pipe-friendly: each writer returns qv invisibly)
qv |>
  write_qview_xlsx("out.xlsx") |>
  write_qview_csv("out_csv/")  |>
  write_qview_rds("out.rds")

# Per-analyte mean / SD / CV per well-type group
summary(qv)

# Interactive front-end (upload, visualise, download)
qview_app()

What is a .Q-View file?

A .Q-View file is a single-file container that bundles an embedded H2 SQL database (Java, version 0.5/B) with binary LOB files holding the chemiluminescent plate images. The file is not a ZIP archive, XML, or CSV — it is a proprietary binary container with a plain-text manifest header followed by concatenated H2 segments.

Container layout

+-----------------------------------------+
| Bytes 0 - ~290:  text manifest header   |
|   - container version                   |
|   - declared file entries (size + name) |
+-----------------------------------------+
| Segment 1: main H2 SQL database         |
|   - 36 tables (see schema below)        |
|   - the rendered CSV report (CLOB)      |
+-----------------------------------------+
| Segment 2: LOB file 1 (image data)      |
+-----------------------------------------+
| Segment 3: LOB file 2 (more LOB data)   |
+-----------------------------------------+

Each H2 segment starts with a -- H2 0.5/B -- triplet marker. The database uses 2048-byte pages.

Embedded H2 schema (key tables)

qviewparsR recovers data through the embedded CSV report; the table diagram below documents the underlying schema for reference.

Group Table Purpose
Project / plate PROJECT Project metadata (creator, version, timezone)
PLATE Plate identifiers
PLATEDEFINITION Plate geometry (rows, columns, well diameter)
PRODUCT Product / lot identifiers, linked plate / plex definitions
Well & spot layout WELL Well coordinates (pixel + row/col)
SPOT Per-spot pixel intensity (raw + negative-subtracted), masking flags
PLEXDEFINITION / PLEXSPOT Spot layout per well
Analytes / standards ANALYTE Analyte names
PRODUCTANALYTE Spot number -> analyte mapping (key table)
ANALYTESTANDARD / ANALYTESTANDARDANALYTE Standard curve concentrations
Sample assignment WELLGROUP Sample IDs and type flags (standard / negative / sample / control)
WELLGROUPWELL Well-to-group mapping with dilution factors
Pixel-intensity cache SPOTPIXELINTENSITY Cached per-image spot intensity
NEGATIVESPOTPIXELINTENSITY Negative-spot intensity before subtraction
Curve fitting CURVEFITOPTION Regression model settings (4PL, 5PL, HDR, weighting)
REGRESSIONSOLUTION Fitted curve parameters
Image / camera IMAGE / IMAGEDETAILS / CAMERA Image and imager metadata
Report REPORTCONFIGURATION CSV report column flags
REPORTHISTORY The fully rendered CSV report (CLOB)
REPORTINFO Signatures and approval state

Naming convention

When Q-View imports a well-assignment template CSV it prefixes the identifiers internally:

Template value Q-View internal name
Cal 1Cal N ICal 1ICal N
Low GLow
High HHigh
FD24277364, all-digit IDs NFD24277364, N1211498458

strip_qview_prefix() reverses this transformation, and read_qview(path, strip_prefix = TRUE) applies it across the whole returned object.

Output structure

read_qview() returns a list with class qview:

Slot Description
metadata Project, plate, image, imager, product, user, software version, template name, container version, file path, parse timestamp
manifest One row per declared file entry inside the container
segments Byte ranges of the three H2 segments
analytes spot_number, analyte, unit, lod, lloq, uloq, assay_control_low/high
well_groups well_group, sample_id, type flags (is_standard, is_negative, is_sample, is_control), well_type factor
pixel_intensities Long-format per-well replicate readings
summary_statistics Per-group average, std_dev, cv rows
concentrations Long-format concentrations, or NULL if the report is qualitative
curve_fit Per-analyte regression model
report_csv Raw CSV report lines
plate_layout One row per plate well with sample assignment + well type

Function reference

Category Functions
Reader read_qview()
Helpers strip_qview_prefix(), well_label()
Optional read_qview_template()
Methods print.qview(), plot.qview()
Export write_qview_xlsx(), write_qview_csv(), write_qview_rds()
Summary summary.qview() (mean / SD / CV per analyte x well type)
Shiny app qview_app()

Citation

If you use qviewparsR in academic work, please cite:

Heller R, Mannes M (2026). qviewparsR: Read .Q-View Multiplex ELISA Project Files. R package version 1.0.0. https://github.com/CTTIR/qviewparsR

BibTeX:

@Manual{qviewparsR,
  title  = {qviewparsR: Read .Q-View Multiplex ELISA Project Files},
  author = {Raban Heller and Marco Mannes},
  year   = {2026},
  note   = {R package version 1.0.0},
  url    = {https://github.com/CTTIR/qviewparsR}
}

You can always retrieve the up-to-date entry directly from R:

citation("qviewparsR")

License

MIT (c) 2026 Raban Heller.