Skip to content

Varjo XR-4

Recordings from Varjo Base's eye tracking recorder. Reader: cwtool/devices/varjo.py. Checked against a Varjo Base export from April 2026.

Folder

recording/
├── varjo_gaze_output_<date>.csv     # eye tracking, 200 Hz
├── varjo_capture_<date>.mp4         # capture of the left-eye view
└── <date>_event_log.csv             # optional, from tools/event_logger.py

Gaze CSV

Columns are found by header name, falling back to the positions of the pilot study's export for files without a header. Values written as -nan(ind) (Varjo Base on Windows) are read as missing.

Used for Column
time (video clock) relative_to_video_first_frame_timestamp (ns)
Unix time relative_to_unix_epoch_timestamp (ns)
validity status, left_status, right_status (tracked when > 1; Varjo writes 0 = lost, 2 = tracked)
pupil left_pupil_diameter_in_mm, right_pupil_diameter_in_mm
gaze gaze_projected_to_left_view_x/y (default), or left_projected_x/y, right_projected_x/y

Each eye's pupil is valid where that eye's status is tracked and the gaze status too, so a sample with one eye lost keeps the other (the pipeline bridges the missing eye). The gaze is valid where its eye is tracked (for the combined gaze, either eye).

Pupil scale

Older Varjo Base versions write the pupil radius in its diameter columns (confirmed by Varjo by email), so the pupil scale is 2. Their iris diameter column reads a constant 6.04 mm, half a typical iris, which fits. A later version (a September 2026 sample) writes real diameters: the iris column reads a constant 12.2–12.5 mm and the pupil–iris ratio matches. The reader tells the two apart by the median iris diameter (above 9 mm: diameters, scale 1; below, or unreadable: radii, scale 2), so each recording gets its own scale; the Recording box shows it. The calibration fits do not estimate the pupil scale: one sequence does not determine it, and the dark-adapted pupil of a recording (6.4–7.7 mm in the September 2026 sample) bounds it to about 0.9–1.2, so the device's scale is used. A participant correction (pupil_correction) can be set by hand (open issue 1).

Gaze

The capture shows the left eye's view. The combined gaze projected to that view is used by default; the left eye's own projection is available (gaze_eye="left"), the right eye's is in the right view and so offset from the capture. Projected coordinates run from −1 to 1 with y up and are converted to 0–1 with y down.

Scene video

H.264 at a steady 30 fps; the gaze timestamps are relative to its first frame, so frames are matched by frame rate. The scene is a circle with black corners: the background area is a centred circle (radius 0.8 of half the frame height by default) to exclude them.

Profile

Pupil mm, scale 2.0 (radius export) or 1.0 (diameter export, from the iris column)
Luminance display: the scene capture's colours mapped through the display photometry, with the participant's light sensitivity
Field of view 120° × 105° (nominal); the adapting field is the same
Circular scene yes
Rate 200 Hz

Calibration

Each participant watches the full-field calibration sequence in the headset; see Participant calibration. In the April 2026 sample the sequence used 10 s steps starting 16.4 s into the recording, and "Find in recording" located it in 0.2 s.