Data output
Every file RSLogger writes and every column in it. The headers below were taken from the version 0.2.16 source.
Session folder
RSLogger creates one folder per session inside the folder you choose when you click Start. Each module writes into its own subfolder. A control file at the top level records every button press.
session_YYYYMMDD_HHMMSS/
├── YYYYMMDD_HHMMSS_CONTROL.csv
├── Cameras/
│ └── <camera id>/
│ ├── <token>_CAM_trial<NNN>_<camera>.mp4
│ └── <token>_CAM_trial<NNN>_<camera>_timing.csv
├── picam0/ (CSI camera, Raspberry Pi)
│ ├── <token>_CSI_trial<NNN>_<camera>.avi
│ └── <token>_CSI_trial<NNN>_<camera>_timing.csv
├── Audio/
│ ├── <token>_AUD_trial<NNN>_MIC<n>_<microphone>.wav
│ └── <token>_AUD_trial<NNN>_MIC<n>_<microphone>_timing.csv
├── EyeTracker-Neon/
│ ├── <token>_ET_trial<NNN>_WORLD_<w>x<h>_<fps>fps.mp4
│ ├── <token>_ET_trial<NNN>_EYES_384x192_<fps>fps.mp4
│ ├── <token>_ET_trial<NNN>_AUDIO.wav
│ ├── <token>_ET_trial<NNN>_GAZE.csv
│ ├── <token>_ET_trial<NNN>_EVENTS.csv
│ └── <token>_ET_trial<NNN>_IMU.csv
├── DRT/
│ └── <token>_DRT_<device>.csv
├── VOG/
│ └── <token>_VOG_<port>.csv
├── GPS/
│ └── <token>_GPS_<device>.csv
└── Notes/
└── <token>_NTS_trial<NNN>_notes.csv File names
| Part | Meaning | Example |
|---|---|---|
<token> | The session folder’s timestamp | 20260318_143022 |
<NNN> | Trial number, three digits | 001 |
<camera>, <microphone> | The device name in lower case with spaces removed | hdprowebcamc920 |
<camera id> | The camera’s stable identifier | usb_1-2.3 on Linux, 0 on macOS and Windows |
<device>, <port> | The serial port, lower case, with / and : replaced by _ | dev_ttyacm0, wDRT_dev_ttyacm0 |
Cameras, audio, the eye tracker and notes write a new file set for each trial. The DRT, the goggles and GPS keep one file per device open for the whole session and append a row for each event, so the trial is read from the trial column.
Columns shared by every module
Every CSV that a module writes starts with the same six columns.
| Column | Type | Description |
|---|---|---|
trial | int | RSLogger’s trial number, counted from 1 in each session. In the DRT file this column holds the device’s stimulus count instead, see below |
module | string | The module name |
device_id | string | The device the row came from |
label | string | The Trial Label typed in the main window. Empty if none |
record_time_unix | float | Host wall-clock time when the row’s data reached RSLogger. Seconds since 1970-01-01 UTC, six decimals |
record_time_mono | float | Host monotonic clock at the same instant. Seconds, nine decimals. See Synchronization |
Control file
YYYYMMDD_HHMMSS_CONTROL.csv sits in the session folder and has one row per event in the main window.
| Column | Description |
|---|---|
record_time_unix | Host wall-clock time, six decimals |
record_time_mono | Host monotonic clock, nine decimals |
timestamp_utc | The same instant as ISO 8601 text in UTC, to the millisecond |
event_type | session_start, session_stop, trial_start, trial_stop, button_press, or a module lifecycle event |
details | For trial_start, the trial number and label. For session_start, the folder path. For button_press, which button |
This file is the record of when you pressed Record and Pause, and it is the simplest way to find the start of a trial on the shared clock.
Cameras
One MP4 and one timing CSV per camera per trial. USB cameras write H.264 in an MP4 container, with AAC audio when the camera’s microphone is enabled. CSI cameras on the Raspberry Pi write MJPEG in an AVI container.
Timing CSV, 9 columns
| Column | Description |
|---|---|
The six shared columns. module is USBCameras or CSICameras | |
frame_index | Frame number in the video file, from 1 |
sensor_timestamp_ns | The camera sensor’s own timestamp in nanoseconds. CSI cameras only, 0 for USB cameras |
video_pts | Presentation timestamp of the frame in the video container |
For a USB camera, record_time_* is taken when the frame is read from the camera driver.
Audio
One WAV and one timing CSV per microphone per trial. The WAV is 16-bit PCM, one channel, at the sample rate in the module settings. A microphone with several channels is recorded from its first channel.
Timing CSV, 8 columns
| Column | Description |
|---|---|
The six shared columns. module is Audio | |
device_time_unix | The audio driver’s ADC timestamp for the chunk, in seconds, when the driver provides one. Otherwise empty |
chunk_number | Sequential chunk number, from 1 |
Each row is one chunk of samples as the driver delivered it. record_time_* is taken in the driver callback when the chunk arrives.
Eye tracker
Per trial: scene video, eye video, optional scene audio, and three CSV files. The scene video is H.264 in MP4 at the resolution and frame rate set in the module. The eye video is 384 × 192 pixels, both eyes side by side.
GAZE CSV, 36 columns
| Column | Description |
|---|---|
The six shared columns. module is EyeTracker | |
device_time_unix | The Neon’s timestamp for the sample, seconds since the Unix epoch on the Companion phone’s clock |
device_time_ns | The same timestamp in nanoseconds |
stream_type | Which gaze record the Neon sent. The eye-state and eyelid columns are empty when the record does not carry them |
worn | 1 when the Neon reports the glasses as worn, 0 when not |
x, y | Gaze point in scene camera pixels, as the Neon reports it. The scene camera frame is 1600 × 1200 |
left_x, left_y, right_x, right_y | Gaze point per eye, same units |
pupil_diameter_left, pupil_diameter_right | Pupil diameter in millimetres |
eyeball_center_left_x/y/z, eyeball_center_right_x/y/z | Eyeball centre in the scene camera’s 3D coordinates |
optical_axis_left_x/y/z, optical_axis_right_x/y/z | Optical axis direction per eye |
eyelid_angle_top_left, eyelid_angle_bottom_left, eyelid_aperture_left | Eyelid angles and aperture, left eye |
eyelid_angle_top_right, eyelid_angle_bottom_right, eyelid_aperture_right | Eyelid angles and aperture, right eye |
EVENTS CSV, 24 columns
| Column | Description |
|---|---|
The six shared columns, then device_time_unix and device_time_ns as in the gaze file | |
event_type | Fixation, saccade or blink, as the Neon classifies it |
event_subtype | The Neon’s category for the event |
confidence | The Neon’s confidence in the event |
duration | Event duration |
start_time_ns, end_time_ns | Event start and end on the Neon’s clock, nanoseconds |
start_gaze_x, start_gaze_y, end_gaze_x, end_gaze_y | Gaze point at the start and end of the event |
mean_gaze_x, mean_gaze_y | Mean gaze point during the event |
amplitude_pixels, amplitude_angle_deg | Saccade amplitude in pixels and degrees |
mean_velocity, max_velocity | Saccade velocity |
IMU CSV, 19 columns
| Column | Description |
|---|---|
The six shared columns, then device_time_unix and device_time_ns as in the gaze file | |
gyro_x, gyro_y, gyro_z | Angular velocity |
accel_x, accel_y, accel_z | Acceleration |
quat_w, quat_x, quat_y, quat_z | Head orientation as a quaternion |
temperature | IMU temperature |
Units for the IMU, event and eye-state fields are those of the Pupil Labs real-time API, which the Neon documentation defines.
Detection response task
One CSV per DRT device for the whole session. Each row is one stimulus.
Wired DRT, 11 columns
| Column | Description |
|---|---|
trial | The device’s stimulus count. It restarts at 1 each time you press Record, so use label or the control file to tell trials apart |
module, device_id, label, record_time_unix, record_time_mono | As in every module. module is DRT. record_time_* is taken when the device’s result message for the stimulus arrives |
device_time_unix | Empty. The wired unit has no clock of its own |
device_time_offset | Stimulus onset in milliseconds since the device started the experiment, on the device’s clock |
responses | Number of button presses between this stimulus and the next |
reaction_time_ms | Onset to first press in milliseconds, measured on the device. −1 when there was no press before the next stimulus |
stim_type | 1 for the standard stimulus. 2 for the secondary stimulus on the two-stimulus firmware variant. Standard units only ever write 1 |
Wireless DRT, 11 columns
The same columns as the wired unit through reaction_time_ms, except that device_time_unix carries the device’s real-time clock, then:
| Column | Description |
|---|---|
battery_percent | Battery charge, 0 to 100 |
RSLogger logs the reaction time as the device reports it. It does not apply the 100–2500 ms window that ISO 17488 uses to classify hits. The DRT page shows how to apply it in analysis.
Visual occlusion goggles
One CSV per goggle controller for the whole session. Each row is one trial.
Wired goggles, 9 columns
| Column | Description |
|---|---|
The six shared columns. module is VOG. record_time_* is taken when the trial’s result arrives from the controller | |
device_time_unix | Empty. The wired controller has no clock of its own |
shutter_open | Total shutter open time for the trial in milliseconds, accumulated on the controller |
shutter_closed | Total shutter closed time for the trial in milliseconds |
Wireless goggles, 12 columns
The same nine columns, with device_time_unix carrying the device’s real-time clock, then:
| Column | Description |
|---|---|
shutter_total | shutter_open plus shutter_closed |
lens | Lens state the row refers to: Open, Closed, Left or Right |
battery_percent | Battery charge, 0 to 100 |
GPS
One CSV per receiver for the whole session. Each row is one parsed NMEA sentence.
GPS CSV, 25 columns
| Column | Description |
|---|---|
The six shared columns. module is GPS. record_time_* is taken when the sentence is parsed on the host | |
device_time_unix | The UTC time carried in the NMEA sentence, as seconds since the Unix epoch. Empty if the sentence has no time |
latitude_deg, longitude_deg | Decimal degrees. North and east are positive |
altitude_m | Altitude above mean sea level, metres |
speed_mps, speed_kmh, speed_knots, speed_mph | Speed over ground in each unit |
course_deg | Course over ground, degrees from north |
fix_quality | NMEA fix quality code. 0 no fix, 1 GPS, 2 differential |
fix_mode | Fix mode as reported |
fix_valid | 1 when the receiver reports a valid fix, 0 otherwise |
satellites_in_use, satellites_in_view | Satellites in the solution, and visible |
hdop, pdop, vdop | Horizontal, position and vertical dilution of precision |
sentence_type | NMEA sentence type, for example RMC or GGA |
raw_sentence | The sentence as received |
RSLogger keeps a running snapshot of the fix, updates it from each sentence and writes the whole snapshot per row, so each row holds the latest known value of every field. A field is empty until a sentence that carries it has arrived.
Notes
One CSV per trial. Each row is one note.
Notes CSV, 8 columns
| Column | Description |
|---|---|
The six shared columns. module is Notes and device_id is notes. record_time_* is taken when you post the note | |
device_time_unix | Always empty |
content | The note text |
Timestamp formats
| Timestamp | Format | Use |
|---|---|---|
record_time_unix | Seconds since 1970-01-01 UTC, six decimals | Absolute time. Comparable across computers whose clocks are set |
record_time_mono | Seconds on the host’s monotonic clock, nine decimals. The zero point is arbitrary | Differences between rows on the same computer in the same boot |
timestamp_utc (control file) | ISO 8601 text in UTC, milliseconds | Reading by eye |
device_time_* | Depends on the device, see each module above | Timing on the device’s own clock |
Six decimals on a wall-clock value and nine on a monotonic value describe how the numbers are written, not how accurately any event was timed. Synchronization explains what each timestamp does and does not tell you.