Skip to content

Physiological data (no neural recording)

This guide explains how to prepare physiological data without any neural recordings using the BIDS specification. It combines the rules from behavioral experiments and physiological recordings.

1. Behavioral (event) files

Even without neural recordings, you can still describe behavioral aspects. BIDS defines two file types depending on whether you have timestamps:

*_events.tsv — use when you have onset and duration information

  • Must be tab-separated
  • First line contains column headers
  • Each row = one event
  • Required columns:
    • onset — time in seconds from the start of the recording
    • duration — length in seconds; use n/a if unknown

*_beh.tsv — use when you have behavioral logs without onset/duration

  • Same TSV format, but no required columns
  • Suitable for response logs, questionnaire data, or other non-timestamped records

Optional columns for both types: trial_type, response_time, stim_file, HED.

Example sub-01_task-nback_events.tsv:

onset duration trial_type response_time
0.5 1.5 instruction n/a
2.3 1.0 target 0.53
4.8 1.0 lure 0.70

*_events.json / *_beh.json

The JSON sidecar must contain a description for every column in the TSV. Use at least Description. You can also add Units, Levels (for categorical values), or TermURL.

Example sub-01_task-nback_events.json:

{
  "onset": {
    "Description": "Onset of the event, in seconds relative to recording start",
    "Units": "seconds"
  },
  "duration": {
    "Description": "Duration of the event",
    "Units": "seconds"
  },
  "trial_type": {
    "Description": "Type of trial",
    "Levels": {
      "instruction": "Instruction screen",
      "target": "Target stimulus",
      "lure": "Lure stimulus"
    }
  },
  "response_time": {
    "Description": "Response time to the stimulus",
    "Units": "seconds"
  }
}

2. Physiological Recordings (_physio)

Continuous signals (e.g. cardiac, respiration, eye-tracking) are stored as _physio.

A. TSV file

  • Named *_physio.tsv.gz
  • No header line
  • Rows = samples, columns = channels

B. JSON sidecar

  • Named *_physio.json
  • Required fields:
    • SamplingFrequency: Hz
    • StartTime: seconds relative to acquisition start
    • Columns: array naming each channel
  • Recommended fields:
    • Manufacturer, DeviceSerialNumber, SoftwareVersions
    • Per-channel metadata: Description, Units

Example:

{
  "SamplingFrequency": 100.0,
  "StartTime": -22.345,
  "Columns": ["cardiac", "respiratory", "trigger"],
  "Manufacturer": "Your Device Maker",
  "cardiac": {"Description": "pulse signal", "Units": "mV"},
  "respiratory": {"Description": "breathing belt", "Units": "mV"},
  "trigger": {"Description": "stimulus trigger channel"}
}

If you continuously record stimulus parameters (e.g. video brightness), store them as:

  • _stim.tsv.gz — numeric data, no header
  • _stim.json — metadata with SamplingFrequency, StartTime, Columns

4. Handle multiple sampling frequencies or recording devices

Note

This applies when channels were acquired at different sampling rates or with different devices.

Split them into separate files and distinguish with [_recording-<label>] in the filename:

sub-01_task-rest_recording-cardiac_physio.tsv.gz
sub-01_task-rest_recording-respiratory_physio.tsv.gz

5. Directory structure

Your dataset should follow the BIDS layout. Note that a session directory is mandatory in the ANC, even for single-session studies.

sub-<label>/
└── ses-<label>/
    └── beh/
        ├── sub-<label>_ses-<label>_task-<label>[_acq-<label>][_run-<index>]_beh.json
        ├── sub-<label>_ses-<label>_task-<label>[_acq-<label>][_run-<index>]_beh.tsv
        ├── sub-<label>_ses-<label>_task-<label>[_acq-<label>][_run-<index>]_events.json
        ├── sub-<label>_ses-<label>_task-<label>[_acq-<label>][_run-<index>]_events.tsv
        ├── sub-<label>_ses-<label>_task-<label>[_acq-<label>][_run-<index>][_recording-<label>]_physio.json
        ├── sub-<label>_ses-<label>_task-<label>[_acq-<label>][_run-<index>][_recording-<label>]_physio.tsv.gz
        ├── sub-<label>_ses-<label>_task-<label>[_acq-<label>][_run-<index>][_recording-<label>]_stim.json
        └── sub-<label>_ses-<label>_task-<label>[_acq-<label>][_run-<index>][_recording-<label>]_stim.tsv.gz