Demo data
Every slide and session the showcases use is described here, and this page is
generated from the two files that actually drive them —
test/fixtures/data/manifest.json
and test/fixtures/sessions/index.json.
Nothing here is maintained by hand, so it cannot describe a file that is not
fetchable.
Getting it
npm run fixtures:fetch # download + verify every slide below
npm run fixtures:fetch -- --list # what is present, what is missing
npm run fixtures:derive # build the derived overlays
npm run fixtures:serve # serve it on :9100, with byte ranges
Each slide carries a SHA-256. A mismatch deletes the download and fails rather
than warning: a truncated TIFF opens far enough to render a plausible-looking
wrong demo. Set XOPAT_FIXTURE_BASE to fetch from a mirror.
There is also a slide that needs no download at all — npm run fixtures:synthetic
generates a DeepZoom pyramid from tracked code, which is what makes
npm run up:dev -- synthetic the one deployment with zero external dependencies.
Slides
| File | What it is | Size | Licence | Provenance | Used by |
|---|---|---|---|---|---|
LuCa-7color_Scan1.ome.tiff | Fluorescence, 7-channel OME-TIFF | 1989 MiB | OME public sample data | Open Microscopy Environment sample data, 2016-06 sub-resolutions set | viz-flex-multichannel, fluorescence-background, channel-series, all-shaders |
slide.tif | H&E slide, the cancer-prediction subject | 652 MiB | not stated | RationAI; the slide every prediction overlay below was inferred over | basic-overlay, time-series, all-shaders, multi-view-goals, viz-flex-multichannel, viz-flex-geojson, viz-flex-mvt, viz-flex-grid, viz-flex-mask-coarse, viz-flex-mask-preview |
cancer-inference.tif | Cancer prediction over slide.tif | 44 MiB | not stated | RationAI model output; 512x512 prediction squares | basic-overlay, time-series, all-shaders, multi-view-goals, derive:vector, derive:mvt, derive:grid, derive:pyramid |
detection.tiff | Graded detection map over slide.tif | 14 MiB | not stated | RationAI model output; the third class in the derived vector layers | derive:vector, derive:mvt, derive:grid, derive:pyramid |
annotations.tif | Rasterized annotations for slide.tif (white = annotation) | 11 MiB | not stated | RationAI ground-truth annotations, rasterized | basic-overlay, time-series, all-shaders |
explainability.tif | Explainability map for the prediction over slide.tif | 16 MiB | not stated | RationAI model output | basic-overlay, time-series, all-shaders |
slide-errors.tif | H&E slide used for the error-overlay sessions | 646 MiB | not stated | RationAI | grouped-errors, multi-view-goals, all-shaders |
channel-error.tif | Inference error caused by a channel offset, over slide-errors.tif | 48 MiB | not stated | RationAI; a real failure mode, kept because the error UI needs one | grouped-errors, multi-view-goals, all-shaders |
other-error.tif | Inference error of a second kind, over slide-errors.tif | 32 MiB | not stated | RationAI | grouped-errors, multi-view-goals, all-shaders |
Sessions
Each session is a plain JSON file that opens in the viewer's URL hash. Print an
openable link for one with npm run fixtures:urls, or paste the JSON into
/dev_setup.
visualization
| Session | Demonstrates | Deployment | Needs first |
|---|---|---|---|
basic-overlay | the ordinary case: an H&E background with prediction, annotation and explainability layers stacked over it | npm run up:dev -- webtiff | fixtures:fetch |
two-backgrounds | per-background visualizationIndex, activeBackgroundIndex opening two at once, and a third entry reusing a data reference | npm run up:dev -- webtiff | fixtures:fetch |
multi-view-goals | the multi-viewport grid: two viewers, different slides, independent visualization selection | npm run up:dev -- webtiff | fixtures:fetch |
grouped-errors | shader groups, over two genuine inference failure modes rather than invented ones | npm run up:dev -- webtiff | fixtures:fetch |
all-shaders | the shader registry: every registered layer type except interaction-debug (a debug aid, not a rendering), so a type that fails to register shows up here first | npm run up:dev -- webtiff | fixtures:fetch |
time-series | the time-series wrapper and its source resolver — the broker owns swap-vs-append | npm run up:dev -- webtiff | fixtures:fetch |
multichannel
| Session | Demonstrates | Deployment | Needs first |
|---|---|---|---|
fluorescence-background | shaders declared on a background rather than in a visualization, one per channel | npm run up:dev -- webtiff | fixtures:fetch |
fluorescence-cross-source | per-shader dataReferences retargeting inside a background array, plus use_gamma | npm run up:dev -- webtiff | fixtures:fetch |
channel-series | the channel-series wrapper: one data entry, channels browsed as a series | npm run up:dev -- webtiff | fixtures:fetch |
viz-flex
| Session | Demonstrates | Deployment | Needs first |
|---|---|---|---|
viz-flex-multichannel | channel fan-out, plus one layer retargeted at a different data entry | npm run up:dev -- viz-flex-demo | fixtures:fetch |
viz-flex-geojson | autodetected GeoJSONTileSource — a vector layer needs no protocol declaration | npm run up:dev -- viz-flex-demo | fixtures:fetch, fixtures:derive |
viz-flex-mvt | a sparse MVT pyramid over the slide's own pixel space, via the demo-mvt factory protocol | npm run up:dev -- viz-flex-demo | fixtures:fetch, fixtures:derive |
viz-flex-grid | imageSmoothingEnabled: false with pixelScale: 512 — without the latter the overlay is squeezed | npm run up:dev -- viz-flex-demo | fixtures:fetch, fixtures:derive |
viz-flex-mask-coarse | coarsest level 1025 px, below PREVIEW_LEVEL_MIN_COARSEST_PX — the decline path | npm run up:dev -- viz-flex-demo | fixtures:fetch, fixtures:derive |
viz-flex-mask-preview | coarsest level 4100 px — injection fires on the overlay layer, not the background | npm run up:dev -- viz-flex-demo | fixtures:fetch, fixtures:derive |
errors
| Session | Demonstrates | Deployment | Needs first |
|---|---|---|---|
errors-partial-viz | partial degradation: a broken shader must not take its visualization or the slide down with it | npm run up:dev -- webtiff | fixtures:fetch |
errors-all-invalid | the fully-failed-open path — every background faulty, and the viewer still has to say so rather than hang | npm run up:dev -- webtiff | nothing |
empty-session | empty background and visualizations: activeBackgroundIndex: [] means nothing open, not everything | npm run up:dev -- webtiff | fixtures:fetch |
annotations
| Session | Demonstrates | Deployment | Needs first |
|---|---|---|---|
annotations-lab | the subject of the annotations/measurements/pathology loop: one stained background with microns declared, so measured areas come back in µm² instead of pixels | npm run up:dev -- annotations-lab | fixtures:fetch |
annotations-lab-overlay | measuring with source: "rendered" — the sampler reads the composited canvas, so what a threshold selects changes with the overlay, unlike the raw-data sources | npm run up:dev -- annotations-lab | fixtures:fetch |
dicom
| Session | Demonstrates | Deployment | Needs first |
|---|---|---|---|
dicom-google-standalone | derived: "auto" — the plugin finds SEG/parametric series for the source series itself | npm run up:dev -- googledicom | env GOOGLE_DICOM_SERVICE_URL |
dicom-google-standalone-explicit | the explicit {role, sourceSeriesUID} shape; the seriesUID is a placeholder you fill in from your own store | npm run up:dev -- googledicom | env GOOGLE_DICOM_SERVICE_URL |