Skip to content

Physiological-only data

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.

  • *_beh.tsv
  • Must be a tab-separated text file (*.tsv)
  • First line contains headers (column names)
  • Each row = one event
  • Required columns (for fMRI tasks):
  • onset (time in seconds from scan start)
  • duration (length in seconds; use "n/a" if unknown)

You can add more columns (e.g., trial_type, response_time, stim_file, etc.).

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
  • *_beh.json

The JSON 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 scan 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 in case channels were acquired at different sampling rates or with different devices.

  • Split them into separate files
  • 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:

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
  • All filenames follow the BIDS entity convention.
  • when to use the [_recording-<label>] you can find in section 5.