The science behind the suite

Written for the bench,
built on what the field uses.

Nearly all of the computing happens in your own browser, in engines written for these tools. Where a calculation belongs to an established package, that package does it. Here is the whole inventory, and what each result is checked against before it ships.

Where the computing happens

In your browser, for almost everything. Each tool is a set of JavaScript modules loaded straight by the page: no framework, no build step, nothing installed on your machine. That is why they open instantly on the computer next to the instrument, and why your FCS files, plate maps and Ct tables never have to travel anywhere to be analysed.

On our server, for two things that belong there. TwistPlot renders its figure and runs its statistics in R. LavaSEQ runs its differential expression and its enrichment in R, because DESeq2, limma and fgsea are the implementations the field reads and reviews. In both cases the file you send is deleted as soon as the job finishes, and it is written down plainly on the data page.

What each tool is built from

Libraries used by each tool, in the browser and on the server
ToolIn your browser On our server
TwistPlotThe table editor, the figure preview and every setting. The figure and the statistics. ggplot2 with patchwork, cowplot, ggbeeswarm, ggpattern and scales draw it; svglite, rsvg, magick, qpdf and pdftools write the exports; officer with rvg produces the PowerPoint. The tests come from survival, lme4, rstatix and R's own stats.
SorbetEverything. Curve fitting by ml-levenberg-marquardt, spreadsheets read and written by SheetJS. Nothing leaves your computer
CtExplorerEverything. Quantification, primer design and statistics are engines written for the tool; jsPDF and SheetJS handle the exports. Nothing leaves your computer
CytoMixEverything. The FCS reader, the spectral model and the clustering are written for the tool; pdf.js, jsPDF and SheetJS handle the documents. Nothing leaves your computer
FlowFusionEverything. The FCS reader and writer are written for the tool, and FlowJo and SpectroFlo files are parsed with the browser's own XML parser. Nothing leaves your computer
LavaSEQQuality control, normalisation, and the whole single-cell path. h5wasm reads .h5ad files. Differential expression and enrichment. DESeq2 and limma for the contrasts, fgsea with msigdbr for the gene sets, sva for batch correction, with AnnotationDbi and SummarizedExperiment around them.
PlaquoEverything. jsPDF, pdf-lib and pdf.js print the plates, the box maps and the label sheets; qrcode.js writes the codes; SheetJS reads the spreadsheets. Nothing leaves your computer
DizicsEverything. jsPDF writes the protocol and the label sheets. Nothing leaves your computer
MirageEverything. jsPDF, JSZip and UTIF produce the downloads, and are fetched only when you ask for one. Nothing leaves your computer

Read off the repositories on 2026-10-01. Test tooling is not listed: it runs here, never on your machine. The methods these libraries implement, and the papers behind them, are on the methods page.

What each result is checked against

An engine written for a tool has to agree with the implementation everyone else uses. So the reference values are produced by running that implementation, in R or in Python, and written straight to a fixture file: edgeR's own normalisation factors, Scanpy's own principal components, the parameters minpack.lm converges on, the p-values R's stats returns. They are never typed by hand and never rounded to look tidy, because comparing a result computed to fifteen digits against a reference written to six measures the rounding and nothing else.

The browser engine is then compared to those values, usually at a tolerance of 1e-9, and tighter where the computation allows it.

Checks against reference values, per tool
ToolChecked againstChecks
CytoMixspectra, spillover and mix volumes computed in R 8,754
CtExplorerquantification, melting temperatures and statistics computed in R 7,094
FlowFusionstain indices computed in R, and real FCS files of every encoding 463
LavaSEQedgeR, limma and DESeq2 for bulk, Scanpy 1.12 for single-cell 356
Sorbetcurves fitted by minpack.lm in R 264
Plaquolayouts and series computed in R 133
Dizicsdoses, dilutions and recipes computed in R 153
Total, re-run before every release 17,217

Counted by running the suites themselves on 2026-10-01. Interface tests, which drive a real browser rather than compare numbers, are not in this table.

And a real browser opens the app before anything ships

Matching numbers in a test runner is not enough: a tool whose button no longer works is broken even if its arithmetic is perfect. Each deployment script drives a real browser through the actual app, clicking the real path, and refuses to publish if anything fails or if a single error reaches the console.

Deliberate differences are written down, and tested

Some results differ from the reference on purpose: an edge case handled, a default made explicit, a bug not carried over. Each one is recorded in that tool's DIVERGENCES.md with its reason, and each one has its own test. A difference that is not in that file is a bug, not a decision.

What this does not claim

Atlascope is for research. It is not a medical device, not a diagnostic tool, and carries no regulatory or accreditation status. Nothing here should be used to make a clinical decision.

  • A correct computation is not a correct experiment. A standard curve can fit beautifully through bad dilutions, and a differential expression table can be immaculate and meaningless. These tools check their own arithmetic; they cannot check your design, your controls or your samples.
  • The tool runs the analysis you choose; it does not choose for you. Which test, which normalisation, which reference genes, which threshold: those remain your decisions, and your responsibility in a methods section.
  • Agreeing with a package is not proof that the package suits your data. The methods themselves, and the papers they come from, are on the methods page, so the choice can be checked as well as the sum.
  • Single-cell results follow Scanpy's implementations. Another toolchain, Seurat in particular, can legitimately give somewhat different clusters or markers from the same matrix.
  • Atlascope is in beta and changes often. Numbers can change between versions when a difference is fixed. That is why the version belongs in your methods section, why the citation includes it, and why every change is listed in the changelog.
  • The formal documents are not written yet. Terms of use and a privacy notice have to be reviewed by someone qualified before they mean anything. Until they are published, what we can give you is an honest description of how the software behaves, which is on this page.

Found a number you disagree with?

That is the single most useful message you can send us. Write to support@getatlascope.com with the file and what you expected: a disagreement about a value is either a bug we will fix and cover with a test, or a difference we have to document properly. Either way the answer ends up on this page.