Tutorial

Walk the BIDS Manager GUI and CLI workflow on real data.

One end-to-end walkthrough. You'll watch the GUI step through scanning, curating, converting, enriching and validating a real MRI dataset, then see the same four stages run from the command line. Step at your own pace, or download one of the four sample datasets and follow along on your own machine.

What makes BIDS Manager different: the scan step.

Other DICOM-to-BIDS tools require you to declare up front how each series should be classified. BIDS Manager scans the raw data first and shows you what is actually inside the folders. Every series, every entity guess, every confidence score. The interactive table you edit is the same one the converter consumes, so what you see is what gets written.

Step 0

What you'll need.

  • BIDS Manager installed. The one-click bootstrap installer is the quickest path; pip works too. See the installation guide.
  • One raw dataset. Either one of the four sample datasets below (each is a small University of Oldenburg cloud download), or your own folder of recordings.
  • About 20 minutes. The GUI walkthrough runs six steps; the CLI section runs five commands. Both use the same engine, so the order is up to you.
Mental model

The workflow at a glance.

You begin by creating or opening a dataset project (the work is saved into it and is resumable). From there BIDS Manager runs in eight stages, alternating user-driven and engine-driven steps. Every step below mirrors what BIDS Manager does on disk, using the same engine the CLI exposes. The full interactive diagram lives on the intro page.

  1. Raw. Your input folder, scanned into a project.
  2. Scan. Read metadata from inside every file.
  3. Curate. Review every acquisition; filter what shouldn't convert.
  4. Convert. Run the right backend per modality.
  5. Enrich. Auto-fill required sidecar fields.
  6. Fix-ups. Open the Editor and fix anything the enrichment couldn't infer.
  7. Validate. Audit against the BIDS schema.
  8. BIDS. A schema-compliant dataset, ready to share.
Pick a dataset

Four sample datasets, one workflow.

The walkthrough below uses the primary MRI dataset (Oldenburg neuroimaging unit). Pick any of the four to download and follow along. Each More info link opens a page with the dataset tree, real CLI numbers, and modality-specific quirks.

MRI

Primary walkthrough.

Oldenburg neuroimaging unit · 3 folders / 2 BIDS subjects · 33 inventory rows.

Small Siemens MRI dataset with T1w, T2w, BOLD, DWI, fmap, and physio. The cleanest end-to-end example, and the one the GUI walkthrough below uses.

EEG

PhysioNet motor imagery.

2 subjects · 14 EDF runs each · 28 inventory rows.

Showcases the task-name override scene: filenames carry only an opaque run token (S001R01...). The user assigns the real protocol task names in the interactive table before any conversion runs.

MEG

Elekta sample data.

2 subjects · 23 FIF files · multi-session inference.

Shows automatic session inference from date-named folders. Tasks parse cleanly (driving, rest, empty-room). Demonstrates the MEG conversion path through mne-bids.

MRI advanced

Richer Siemens dataset.

3 folders / 2 BIDS subjects · 51 inventory rows · 19 skipped.

The deep dive. T1w / T2w / T2starw / FLAIR anatomicals, BOLD plus SBRef, DWI with FA / colFA / trace / TENSOR derivatives, fmap pairs, Siemens CMRR physio.

GUI walkthrough · Primary MRI dataset

Walk the GUI, step by step.

Six steps using the primary MRI dataset (Oldenburg neuroimaging unit: 3 folders, 2 BIDS subjects). Use the dots or the prev / next buttons to step through. For the full dataset detail (tree, real CLI numbers, quirks) see the MRI 1 info page.

This walkthrough is modality-agnostic.

The example below uses the primary MRI dataset because it exercises every datatype (anat, func, dwi, fmap, physio) in a single small folder, but the six steps below are identical for EEG and MEG data. Only the per-row backend swaps: dcm2niix for DICOM rows, mne-bids for EDF / FIF / BDF / BrainVision / CTF, and bidsphysio for Siemens CMRR physio. The Scan -> Inspect -> Convert -> Editor flow you see here is what you do on every supported modality. For modality-specific quirks (session inference from date-named folders, task name overrides in EDF, DWI derivative detection, etc.), see the EEG, MEG, or MRI advanced info pages.

Step 1 of 6
Step 1

Create a project, then point at your raw data.

BIDS Manager is project-first. On the Welcome tab you create a new BIDS dataset or open an existing one; the BIDS output is then locked to that project. In the Converter you set just one path: Raw input, the folder that holds your recordings (one subfolder per scanning session). Everything you do is saved into the project, so you can close the app and resume later.

On the Welcome tab, create a fresh BIDS dataset (it scaffolds dataset_description.json, README, and .bidsignore) or open an existing one. From here on the BIDS output is locked to that project.
Then, in the Converter, point Raw input at the folder that holds your recordings. The Scan button enables once the path is valid.
Step 2

Run a scan.

The Scan… button kicks off an inventory walker. It reads metadata from inside every file (DICOM tags, EDF / FIF headers), clusters folders into BIDS subjects by PatientID, groups files into series by SeriesInstanceUID, and stamps each series with a bids_guess_* entity tuple plus a confidence score. The status chips (valid / warnings / error / skipped) tick to their final counts as it runs.

A scan on the primary MRI sample. The scanner reads metadata from inside every file rather than trusting filenames, so mixed subjects, residual volumes, and repeated takes all surface as separate rows you can see. The status text streams the current stage (walking the folder, reading headers, clustering subjects) and the chips settle on their final counts: 21 keepers, 12 auto-skipped scouts and reports, for 33 inventory rows in total.
Settings → Scan rules. A hint forces any series whose name matches a pattern to a datatype / suffix / task you choose (for example, route anything containing "rest" to func / bold, task rest); an exclusion drops anything matching a sequence name or path. Both are schema-constrained, saved with the project, and read by the CLI via --rules-file.
Step 3

Inspect and curate the inventory.

Once the scan finishes, the Converter fills with panes that share one model: the Inspection table (one row per series), the Filter / structure tree, the Properties panel, and the bottom BIDS preview. Whatever you edit anywhere updates everywhere. Review every conversion decision here before a single byte is written.

Colour-coded inspection table. One editable row per series, with the predicted BIDS basename, datatype, task, run, and the classifier's confidence. The sequence / source column keeps the raw scanner label so you can cross-check what each row really is, and rows are tinted by status (keep / skip / non-image / warning) so anything that needs attention stands out. Click any cell to edit it.
Filter / structure. A schema-grouped tree of every series, by subject / session / datatype, with tri-state checkboxes. Filter by entity to focus the table on a subset, or untick a whole group to drop those rows from the next conversion. It is the same underlying model as the table, just shown as a tree.
Bulk edit. Shift- or Cmd-click to select several rows, then click Bulk edit in the table footer, pick a column, and type one value to write it to every selected row at once, instead of editing them one by one. Ideal for relabelling a whole session or task in a single step.
Manage columns. Show, hide, reorder, and resize the inventory columns to match the dataset you are curating. Each column carries a description so you know what it holds, and your chosen layout is remembered between sessions.
Per-row properties. A schema-aware editor showing only the entities valid for the row's datatype + suffix, required fields marked, with a live predicted path. EEG / MEG rows also carry minimal metadata and per-row device overrides.
Dataset metadata (EEG / MEG enrichment). Fill dataset-wide fields once and the converter writes them into every sidecar: reference, ground, hardware filters, device and cap, institution, power-line frequency, and event labels. Modality-agnostic fields (shared by every recording) and modality-specific ones are colour-separated, and each carries its BIDS-schema definition as a tooltip.
BIDS preview. The bottom dock previews the exact filesystem layout, every folder, file name, and sidecar, that the conversion will write. Confirm it looks right here before committing a single file to disk.
Step 4

Run the conversion.

Click Run conversion. Each row goes to the right backend (dcm2niix for DICOM, mne-bids for EEG / MEG / iEEG, vendored bidsphysio for Siemens physio). BIDS Manager stages each subject in a private temp tree, stitches the cross-file fixups (fmap rename, IntendedFor, scans.tsv), then atomically commits each subject. The Log dock streams every line, and the metadata enrichment engine runs automatically at the end.

Run conversion. The spinner spins, the Run button flips to Cancel, and the Log streams per-row backend output, the cross-file fixups, and the enrichment pass. Each subject is built in a private temporary tree and only moved into the dataset once it succeeds, so an interrupted run never leaves a half-written subject behind. Log lines are colour-coded by stage.
Convert and post-convert settings
Convert & post-convert settings. Parallel workers, residual handling, and Force-EDF re-encoding, plus the post-conversion chain shown as an indented hierarchy you can switch on or off step by step, so metadata enrichment, the fix-ups, and validation run automatically right after each conversion.
Step 5

Edit, fix, and validate.

Switch to the Editor and open the dataset you just converted (the active project opens automatically). The centre pane routes by file type, so one window edits JSON sidecars, edits TSV tables, views volumes and recordings, and runs validation. This is the "fix-ups" stage: you resolve anything the automatic enrichment could not infer, then confirm the dataset is BIDS-valid. The clips below show the four things you do most.

Edit JSON sidecars. Clicking a .json opens a schema-aware form where fields are colour-coded by level (required / recommended / optional / deprecated). Add or delete fields, edit values, and revert or save; a Tree view shows the raw key / value structure when you need it. Required fields the enrichment left as TODO are filled here.
Edit TSV tables. The tabular sidecars, participants.tsv, channels.tsv, events.tsv, *_scans.tsv, open in an editable table that loads on a background thread, so even a very large or very wide file appears instantly and never freezes the window while you scroll or type.
Validate the dataset. Run validation at file, folder, or whole-dataset scope. Layer 1 is the schema-driven audit (per-file sidecar checks plus BIDS Manager rules like TODO placeholders and IntendedFor consistency); the Strict BIDS toggle adds the official structural pass. Findings are grouped by severity, and the tree's per-file status dots update to match.
Jump to issues from the chips. The severity chips in the toolbar are clickable: open the warnings (or errors) list, then click an entry to jump straight to the offending file in the viewer. Fix it, re-validate, and watch the count drop.
Step 6

Inspect the converted data.

The Editor routes the open file by extension: .json sidecars open a schema-aware form, .tsv files an editable table, .nii / .nii.gz the NIfTI viewer, and MEG / EEG / iEEG recordings the signal viewer. Click a file in the BIDS tree and the centre pane re-routes on the fly. Everything renders in-app, with no external tools.

NIfTI viewer. Sagittal, coronal, and axial slices sharing one crosshair, plus a single-pane 2-D view. The toolbar lets you focus on one plane or stay in tri-view, and click-and-drag moves the shared crosshair so all three planes scrub together.
4-D time series. For BOLD and other 4-D volumes a Graph tab plots the signal at the crosshair voxel across every volume, alongside the slices, so you can sanity-check the time course (drift, spikes, motion) without leaving the Editor.
MEG / EEG / iEEG signal viewer. Clicking a recording shows a metadata card first; a Load signal button then opens an interactive viewer where you pick channels, scroll and zoom, apply high-pass / low-pass / notch filters, resample, open an in-app PSD, and overlay BIDS-native events (the view jumps to the first event, since triggers often start well into a recording). No external tools.
CLI reference

Every command, every flag.

BIDS Manager ships seven console scripts plus the GUI entry. Every verb accepts -v for INFO logging and -vv for DEBUG. Synopses below mirror what --help prints on a fresh install of bids-manager on PyPI. The project-first verbs (bidsmgr-create, bidsmgr-project) and the --project flag are additive: every classic positional form still works.

bidsmgr-create

Creates and scaffolds a BIDS dataset workspace (or adopts an existing BIDS folder). Writes dataset_description.json, a README, and a .bidsignore, and initialises the project bundle. The folder name is the dataset slug the other verbs use.

bidsmgr-create <output_dir> [options]

Positional arguments

output_dir
Dataset folder to create or adopt.

Options

--name NAME
Human-readable dataset Name for dataset_description.json (defaults to the folder name).
--description TEXT
Optional project description recorded in the project bundle.

bidsmgr-scan

Walks a raw input folder, reads metadata from inside every file (DICOM tags, EDF / FIF headers), classifies each series with the schema-driven chain, and writes a single inventory TSV with one row per series plus an entities JSON column carrying the BidsGuess. With --project the inventory is saved as a versioned, resumable scan inside the project instead of a loose TSV.

bidsmgr-scan <dicom_root> [<output_tsv>] [options]

Positional arguments

dicom_root
Directory containing the raw recordings (any depth). DICOM, EDF, BDF, BrainVision, FIF, CTF, EEG / MEG, and Siemens CMRR physio are all detected automatically.
output_tsv
Destination path for the inventory TSV. Omit when using --project.

Options

--project DIR
Scan into a project dataset folder (created by bidsmgr-create or the GUI; created / adopted if absent). The inventory is saved as a new versioned scan under <project>/.bidsmgr/project/scans/, so it is resumable in the GUI and never overwrites an earlier scan. --dataset defaults to the project folder name.
--jobs N, -j N
Parallel worker threads used to read file headers. Defaults to 80% of the host CPU count.
--probe-convert
After the metadata walk, run dcm2niix as a probe on every DICOM series (one invocation per SeriesInstanceUID) into a hidden staging tree, harvest what was produced, then remove it. Adds probe_n_files / probe_n_nifti / probe_n_volumes / probe_extensions columns and surfaces conversion anomalies in proposed_issues. The staging tree is always removed, including on error. Slow but most accurate.
--no-bids-guess
Skip the dcm2niix BidsGuess classifier and fall back to the legacy regex-only layer. For comparison / debug.
--dataset NAME
BIDS dataset slug stamped into every row's dataset column. The converter writes each distinct value to <bids_parent>/<dataset>/. Defaults to a slugified form of the raw root's folder name.
--line-freq HZ
EEG / MEG only. Power-line frequency in Hz, stamped into every EEG / MEG row's line_freq column (goes into PowerLineFrequency in the sidecar). Typical values: 50 (most of the world), 60 (Americas / parts of Asia). Per-row TSV value wins.
--montage NAME
EEG / MEG only. Name of a built-in mne montage (e.g. standard_1005, biosemi64) stamped into every EEG / MEG row's montage column. The converter applies it before write_raw_bids, filling electrodes.tsv + coordsystem.json. Per-row TSV value wins.
--rules-file JSON
Path to a JSON file of user scan rules: classifier hints (extend the classifier) and series exclusions (mark matching series include=0), matched by sequence name or path. The same schema the GUI Settings Scan rules tab persists.

bidsmgr-rebuild

Reconciles the inventory TSV's entities JSON column with its derived display cells (proposed_basename, session, task, run). bidsmgr-convert runs this automatically in memory before reading rows, so manual calls are mostly for diff-style preview.

bidsmgr-rebuild <tsv> [options]

Positional arguments

tsv
Inventory TSV produced by bidsmgr-scan.

Options

--from {entities,columns}
Source of truth for this rebuild. Default entities regenerates the display cells from the entities JSON; columns does the reverse (use after editing task / run / session cells in a spreadsheet).
--dry-run
Print the diff but don't write the TSV back.

bidsmgr-convert

Reads the inventory and converts every keeper row to BIDS using the right backend per modality (dcm2niix for DICOM, mne-bids for EEG / MEG / iEEG, bidsphysio for Siemens CMRR physio). Stages each subject privately, then atomic-renames into the BIDS root. Re-running merges new subjects and sessions in safely. With --project it converts the project's active scan version into its locked root, replaying the curation edits recorded in the GUI.

bidsmgr-convert [<tsv>] [<bids_parent>] [options]

Positional arguments

tsv
Inventory TSV produced by bidsmgr-scan. Omit when using --project.
bids_parent
Parent directory; each distinct dataset value becomes a sibling BIDS root underneath. Omit when using --project (output is the project).

Options

--project DIR
Convert the project dataset's active (latest) scan version into its locked root. Resolves the inventory, output, and recording metadata from <project>/.bidsmgr/project, replaying the GUI curation edits. Supersedes the positionals.
--version ID
With --project, convert a specific scan version instead of the latest (version id or index; see bidsmgr-project).
--dataset NAME
Limit conversion to rows whose dataset cell equals this value.
--jobs N, -j N
Number of backend invocations to run in parallel. Defaults to 80% of the host CPU count.
--on-existing {skip,update,replace,error}
Policy when an incoming subject already exists on disk. New sessions and datatypes always merge in; this governs colliding files: skip keep existing (default), update replace only changed files, replace back up + replace colliding files, error abort the subject if anything would collide.
--overwrite
Alias for --on-existing replace.
--recording-meta PATH
EEG / MEG enrichment JSON. Its dataset defaults supply line_freq / montage for blank inventory cells, and its richer fields fill the sidecar reference / ground / filters / device / institution, retype auxiliary channels, and map event codes to labels. Optional; omitting it leaves PowerLineFrequency=50 by default.
--force-edf
Re-encode EEG / iEEG recordings to EDF on write instead of keeping the source format. Harmonises a study to one BIDS-native format and makes a non-BIDS-native but mne-readable source convertible. MEG / NIRS are unaffected.
--keep-residuals
Keep dcm2niix residual / secondary outputs. By default the converter drops the derived single-volume duplicates dcm2niix splits off one input series (e.g. ..._bolda alongside ..._bold), which have no valid BIDS suffix.
--raw-root PATH
Folder the original scan was run against. Used as the first candidate when resolving EEG / MEG rows' relative source_file paths. If omitted, the TSV's parent directory is tried.
--dcm2niix PATH
Override the default dcm2niix binary. Defaults to the one bundled with the bids-manager wheel.
--dry-run
Print the per-row conversion plan; write nothing.

bidsmgr-metadata

Post-conversion metadata engine. Walks a BIDS root and fills every required field the schema can infer (Manufacturer, MagneticFieldStrength, EchoTime, RepetitionTime, etc.) from the converted files. Writes dataset_description.json, enriches every sidecar (including participants.tsv demographics and optional phenotype tables), and leaves a metadata_report.json audit log.

bidsmgr-metadata [<target>] [options]

Positional arguments

target
BIDS root, or a parent containing one or more BIDS roots (the parent form is what bidsmgr-convert writes into). Omit when using --project.

Options

--project DIR
Run on a project dataset folder: the target is the project root and the inventory is resolved from its active scan version (so demographics / phenotype / participants flow through). Supersedes the positional target.
--version ID
With --project, take the inventory from a specific scan version instead of the latest.
--dataset NAME
When target is a parent, limit the run to this single dataset name.
--inventory-tsv PATH
Inventory TSV produced by bidsmgr-scan. Used to enrich participants.tsv with demographics; without it those columns default to n/a.
--participants PATH
Participants spreadsheet (TSV / CSV / XLSX / ODS) keyed by a participant_id column. Its age / sex / handedness columns override the inventory-derived demographics.
--phenotype PATH
Phenotype measure table keyed by participant_id. Repeat for each instrument; each is written to phenotype/<measure>.tsv + JSON.
--fill-todos
For every sidecar with a missing required or recommended field (and for missing recommended fields of dataset_description.json), write the literal string "TODO". Existing values are never overwritten, so you can sweep through later in the Editor.
--name NAME
Dataset Name (defaults to the BIDS root directory name).
--bids-version VERSION
BIDS spec version for dataset_description.json. Defaults to the bundled schema's version.
--license, --author (repeatable), --acknowledgements, --how-to-acknowledge, --funding (repeatable), --ethics-approvals (repeatable), --references-and-links (repeatable), --dataset-doi
Optional dataset_description.json fields. The repeatable ones take one value per flag.
--no-report
Skip writing .bidsmgr/metadata_report.json (written by default so the GUI and CI tooling can pick it up).

bidsmgr-validate

Two-layer validator. Layer 1 (always) is the schema-driven audit: per-file sidecar checks plus the BIDS Manager-specific rules (TODO placeholders, IntendedFor consistency, fmap pair completeness). Layer 2 (opt-in via --strict) adds the official bidsschematools structural pass.

bidsmgr-validate <target> [options]

Positional arguments

target
BIDS root, or a parent containing one or more BIDS roots.

Options

--dataset NAME
When target is a parent, limit to this single dataset name.
--strict
Also run Layer 2: bidsschematools structural validation. Adds path-shape checks and is slower on large trees.
--strict-warn
Treat warnings as errors for the exit code. By default the command exits non-zero only when there is at least one error.
--html
In addition to the JSON report, write a self-contained HTML report at .bidsmgr/validation_report.html. Inline CSS, safe to share or archive. Issues are colour-coded and grouped by scope (dataset / folder / file).
--no-report
Skip writing .bidsmgr/validation_report.json.

bidsmgr-project

Inspects a project dataset and lists its versioned scans. The active scan is the latest, marked with an asterisk. Useful for finding a version id to pass to bidsmgr-convert --version or bidsmgr-metadata --version.

bidsmgr-project <dataset> [--list]

Positional arguments

dataset
Project dataset folder.

Options

--list
List the scan versions (the default action).

bidsmgr (GUI)

Launches the desktop GUI. The Converter and Editor views drive the same engine the CLI exposes, so anything you can do here can be scripted.

bidsmgr [options]

Options

--theme {dark,light}
Initial colour theme. If omitted, the last theme the user selected in-app is restored (default dark on first run).
--project PATH
Open (or create / adopt) a BIDS dataset project at this directory and land in the Converter bound to it (same as the Welcome tab's Open / Create). The output is locked to the dataset. Note: this is a dataset directory, not a bundle file.

The canonical source for every flag is --help on each verb. If a flag here ever drifts out of date, the argparse definitions in the repository are authoritative.

CLI walkthrough

The same workflow, from the command line.

The GUI you just walked is a window onto the same engine you can drive from a script. The project-first flow is five commands: create a project, scan into it, convert, enrich, validate. Numbers below come from the primary MRI dataset (33 inventory rows; 12 auto-skipped; 21 keepers).

1. Create a dataset project.

Scaffolds dataset_description.json, a README, and a .bidsignore, and initialises the project bundle. The folder name is the dataset slug; the BIDS output is locked to it from here on.

# Create the project the scan / convert / metadata steps below write into.
bidsmgr-create <dataset_dir> --name "Oldenburg neuroimaging unit"

2. Scan the raw folder into the project.

Walks the input tree, reads metadata from inside every file, runs the schema-driven classifier, and saves a versioned, resumable scan inside the project. --probe-convert runs one dcm2niix probe per series so the inventory carries the same BidsGuess the converter will see.

# Save a versioned scan under the project; resumable in the GUI.
bidsmgr-scan <raw_root> --project <dataset_dir> --probe-convert -j 4

# 33 rows, 12 pre-marked bids_guess_skip=true (scouts, Phoenix reports).

3. Convert the active scan into the locked BIDS root.

Reads the project's latest scan, dispatches each row to the right backend per modality, stages per subject under .tmp_bidsmgr/, then commits atomically. Re-runs merge new subjects and sessions in safely.

# Convert the project's active version; output is the project itself.
bidsmgr-convert --project <dataset_dir> -j 4 --on-existing skip

# Writes 21 NIfTI files + sidecar JSONs + events / channels TSVs.

4. Auto-fill required sidecar fields.

Runs the post-conversion metadata engine over the project: fills every required field the schema can infer, plus participants.tsv demographics. For EEG / MEG it also fills reference, ground, filters, device, and event labels.

# Auto-enrich sidecars; stamp "TODO" on anything that needs a human.
bidsmgr-metadata --project <dataset_dir> --fill-todos

5. Validate against the BIDS schema.

Two-layer validator: schema-driven per-file checks plus the structural pass under --strict. Prints a severity-coloured summary; the same checks power the Editor's validation pane.

# Validate the dataset; add --strict for the structural pass, --html for a report.
bidsmgr-validate <dataset_dir>

# Primary MRI dataset result: 55 ok / 7 warn / 0 err.
# The 7 warnings are TODO placeholders, fillable in the Editor in one pass.

Prefer the classic form? Every verb still takes positionals: bidsmgr-scan <raw> <inv.tsv>, bidsmgr-convert <inv.tsv> <bids_parent>, and so on. --project is additive. The full surface (every flag, every verb) is in the reference above.