Fernando Voltolini de Azambuja

HDR psychophysics platform

A macOS application for authoring and running visual psychophysics studies on HDR and SDR displays, built as the instrument for an MS thesis in color science.

The question. A psychophysics stimulus is specified in physical units — cd/m², CIE xy, degrees of visual angle — but a display pipeline accepts pixel values. Working space, extended-range activation, GPU composition, and OS tone mapping all sit between the two, and any of them can change what an observer sees while the authored numbers stay put.

What I built. A platform that treats requested stimulus state, realized renderer state, and measured output as three separate objects, and keeps them separate from study authoring through run preparation.

The limitation that governs everything below. Every value in these screenshots is an authored request value. None is a measurement, a threshold, or a fitted result.

Authoring a stimulus in physical units

Stimulus editor showing two gray disks on a black field, with a layer inspector reporting per-layer luminance in cd/m², the size mode, and the display's extended-range context.
Two circle layers at 60.0 and 95.0 cd/m². The inspector reports a 0.95× extended-range ratio against a 100 cd/m² render white.

Each layer carries an explicit luminance in cd/m² rather than a code value — 60.0 and 95.0 for the two disks here. The inspector exposes the size mode (normalized, degVA, or mm), the layer’s study-card binding, and the display’s reported extended-range context: a 0.95× ratio against a 100 cd/m² render white, on a panel reporting a 1,600-nit estimated cap.

That readout is on screen for a reason. On macOS, extended range is not a single switch. It takes a coordinated five-field surface contract, and setting the dynamic-range hint alone does not activate it — while leaving tone mapping automatic lets the OS reshape the very stimulus under test.

From authored units to pixels

Six-stage flow from authored stimulus to measured display output, grouped into requested stimulus state, realized renderer state, and measured output.
Requested stimulus state, realized renderer state, and measured output stay separate by construction: a meter reading joins as a third record rather than as confirmation of the first two.

Chromaticity ratios are normalized in Display P3 and packed into the GPU uniform contract separately from luminance magnitude; the two recombine only at final composition. Keeping that split intact this far down is what makes a requested value still identifiable when it reaches the display. A CR-250 spot measurement enters as a third state — its own run-linked record, not a confirmation of the first two.

Studies are data, not code

Study authoring workspace with the card preview showing two oblique sinusoidal gratings in circular apertures, a spatial two-alternative forced-choice binding, and a generated trial schedule.
200 trials expanded from seed 99999, counterbalanced 100 left and 100 right. This card is marked Training, so its trials are excluded from fitting.

A study is a deck of cards bound to a participant task. The spatial-frequency discrimination study shown is a spatial 2AFC: 200 trials expanded deterministically from seed 99999, side assignment balanced at 100 left and 100 right, responses mapped to clicking a stimulus. The schedule is generated rather than hand-listed and carries a seed, a schedule ID, and a checksum, so the sequence a participant saw can be reconstructed from the run record instead of trusted from a description of it. Material marked Training is excluded from fitting, and that exclusion travels with the data.

Study library listing four studies with identifiers, schema versions, perceptual models, and per-study readiness badges.
Three bundled thesis studies and one researcher-authored draft, all on schema 1.15.0. The draft is the one marked Blocked.

Studies are versioned records with a schema version and a declared perceptual model — CIELAB for the SDR color and spatial studies, JzCzHz for the HDR contrast study. The Blocked badge on a researcher-authored draft is the point of the shot: the same schema validation governs it and the three bundled thesis studies. There is no privileged path for the studies the author wrote first.

Refusing to produce results it cannot back

Run-readiness evaluation showing study validation state, luminance-envelope readiness with per-target measurement rows, and a rehearsal-only posture.
Validation is clear, but the luminance envelope needs calibration: none of the declared targets has a measurement recorded against it.

Readiness is evaluated before a run, not diagnosed after one. Schema and template integrity are clear here, but the luminance envelope reads Needs calibration: the study declares nine measurement targets, eight of them at 1000 cd/m², and none has a measured row behind it yet.

Three fields below that are deferred to capture rather than authored — the measurement footprint (aperture and working distance, which decide whether spot photometry resolves the target), the measurement method, and spatial-frequency resolution. Each is a property of the measurement, so the platform declines to let it be asserted in advance. Formal capture stays blocked until envelope measurements are captured or imported; Preview and Pilot are rehearsal postures that archive no bundle.

How the macOS HDR surface is configured

Extended range needs rgba16Float, extendedLinearDisplayP3, preferredDynamicRange .high, a contentsHeadroom above 1.0, and toneMapMode .never.

Reference table of the five surface fields that place a macOS layer in extended dynamic range, with the value each must hold.
All five fields have to agree. Setting the dynamic-range hint alone leaves the surface in standard range.

What these screenshots do not show

Every state above is a pre-formal-run state, deliberately — the gates are the subject. No measured results, thresholds, or fitted psychometric functions appear here, and none should be inferred from the interface values, which are requested values throughout. The thesis manuscript’s public availability is not established here and is not claimed.