# rordenlab/dcm2niix architecture

> Architecture diagram of the GitHub repository rordenlab/dcm2niix, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/rordenlab/dcm2niix
- Repository: https://github.com/rordenlab/dcm2niix

## Overview

dcm2niix converts vendor-specific DICOM neuroimaging data into NIfTI images and BIDS JSON sidecars, with optional compressed or alternate image formats. The main workflow is DICOM input → CLI/batch discovery → DICOM parsing and pixel decoding → image and metadata output. Documented extensions include physiological recordings, spectroscopy, ReproIn naming and post-processing, plus browser/WASM use. Paths for some capabilities are based on the repository tree and README; their internal wiring was not sampled, so uncertain links are omitted.

Main entry points: [`console/nii_dicom.cpp`](https://github.com/rordenlab/dcm2niix/blob/master/console/nii_dicom.cpp) (DICOM parser), [`console/main_console.cpp`](https://github.com/rordenlab/dcm2niix/blob/master/console/main_console.cpp) (CLI entry), [`console/nii_dicom_batch.cpp`](https://github.com/rordenlab/dcm2niix/blob/master/console/nii_dicom_batch.cpp) (Batch conversion), [`js/src/worker.js`](https://github.com/rordenlab/dcm2niix/blob/master/js/src/worker.js) (WASM worker)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Entry points"]
  node_cli["CLI entry<br/>[main_console.cpp]"]
  node_batch["Batch conversion"]
  node_python_api["Python wrapper<br/>[__init__.py]"]
end

subgraph group_dicom["DICOM processing"]
  node_parser["DICOM parser<br/>[nii_dicom.cpp]"]
  node_fragments["Fragment reassembly"]
  node_jpeg["JPEG decoding<br/>[ujpeg.cpp]"]
  node_jpeg_ls["JPEG-LS decoding<br/>[jpegls.cpp]"]
  node_jpeg_lossless["JPEG lossless<br/>[jpg_0XC3.cpp]"]
  node_foreign["Image codecs<br/>[nii_foreign.cpp]"]
end

subgraph group_outputs["Conversion outputs"]
  node_nifti_io["NIfTI I/O<br/>[nifti1_io_core.cpp]"]
  node_orientation["Image orientation<br/>[nii_ortho.cpp]"]
  node_metadata["Metadata sidecars<br/>[nii_dicom.cpp]"]
end

subgraph group_extensions["BIDS extensions"]
  node_physio["Physiology export<br/>[nii_dicom.cpp]"]
  node_mrs["Spectroscopy export<br/>[nii_dicom.cpp]"]
  node_reproin["ReproIn naming<br/>[reproin.cpp]"]
  node_reproinx["Cross-series BIDS<br/>[reproinx.py]"]
end

subgraph group_browser["Browser runtime"]
  node_browser_api["Browser API<br/>[index.js]"]
  node_worker["WASM worker<br/>[worker.js]"]
  node_wasm["WASM converter<br/>[worker.js]"]
end

node_user(("Operator"))
node_dicom_files["DICOM files"]
node_converted["NIfTI and sidecars"]
node_bids_tree["BIDS dataset"]
node_web_files["Browser files"]
node_web_outputs["Browser outputs"]

node_user -->|"runs"| node_cli
node_dicom_files -->|"supplies"| node_batch
node_cli -->|"starts"| node_batch
node_batch -->|"dispatches"| node_parser
node_parser -->|"reassembles"| node_fragments
node_parser -->|"decodes"| node_jpeg
node_parser -.->|"decodes"| node_jpeg_ls
node_parser -->|"decodes"| node_jpeg_lossless
node_parser -.->|"decodes"| node_foreign
node_parser -->|"writes images"| node_nifti_io
node_parser -->|"transforms images"| node_orientation
node_parser -->|"writes metadata"| node_metadata
node_parser -->|"extracts streams"| node_physio
node_parser -->|"converts spectra"| node_mrs
node_nifti_io -->|"writes images"| node_converted
node_metadata -->|"writes sidecars"| node_converted
node_physio -->|"writes recordings"| node_converted
node_mrs -->|"writes spectra"| node_converted
node_parser -->|"names outputs"| node_reproin
node_converted -->|"post-processes"| node_reproinx
node_reproinx -->|"updates dataset"| node_bids_tree
node_user -->|"invokes"| node_python_api
node_python_api -->|"runs binary"| node_cli
node_user -->|"submits files"| node_browser_api
node_browser_api -->|"sends files and options"| node_worker
node_web_files -->|"provides input"| node_worker
node_worker -->|"invokes"| node_wasm
node_wasm -->|"produces files"| node_web_outputs

click node_cli "https://github.com/rordenlab/dcm2niix/blob/master/console/main_console.cpp"
click node_batch "https://github.com/rordenlab/dcm2niix/blob/master/console/nii_dicom_batch.cpp"
click node_parser "https://github.com/rordenlab/dcm2niix/blob/master/console/nii_dicom.cpp"
click node_fragments "https://github.com/rordenlab/dcm2niix/blob/master/console/dicom_fragments.cpp"
click node_jpeg "https://github.com/rordenlab/dcm2niix/blob/master/console/ujpeg.cpp"
click node_jpeg_ls "https://github.com/rordenlab/dcm2niix/blob/master/console/charls/jpegls.cpp"
click node_jpeg_lossless "https://github.com/rordenlab/dcm2niix/blob/master/console/jpg_0XC3.cpp"
click node_foreign "https://github.com/rordenlab/dcm2niix/blob/master/console/nii_foreign.cpp"
click node_nifti_io "https://github.com/rordenlab/dcm2niix/blob/master/console/nifti1_io_core.cpp"
click node_orientation "https://github.com/rordenlab/dcm2niix/blob/master/console/nii_ortho.cpp"
click node_metadata "https://github.com/rordenlab/dcm2niix/blob/master/console/nii_dicom.cpp"
click node_physio "https://github.com/rordenlab/dcm2niix/blob/master/console/nii_dicom.cpp"
click node_mrs "https://github.com/rordenlab/dcm2niix/blob/master/console/nii_dicom.cpp"
click node_reproin "https://github.com/rordenlab/dcm2niix/blob/master/console/reproin.cpp"
click node_reproinx "https://github.com/rordenlab/dcm2niix/blob/master/tools/reproinx.py"
click node_python_api "https://github.com/rordenlab/dcm2niix/blob/master/dcm2niix/__init__.py"
click node_browser_api "https://github.com/rordenlab/dcm2niix/blob/master/js/src/index.js"
click node_worker "https://github.com/rordenlab/dcm2niix/blob/master/js/src/worker.js"
click node_wasm "https://github.com/rordenlab/dcm2niix/blob/master/js/src/worker.js"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_cli,node_batch,node_python_api,node_web_files,node_web_outputs toneBlue
class node_parser,node_fragments,node_jpeg,node_jpeg_ls,node_jpeg_lossless,node_foreign toneAmber
class node_nifti_io,node_orientation,node_metadata toneMint
class node_physio,node_mrs,node_reproin,node_reproinx toneRose
class node_browser_api,node_worker,node_wasm,node_user,node_dicom_files,node_converted,node_bids_tree toneIndigo
```

## Components

### Entry points

- [CLI entry](https://github.com/rordenlab/dcm2niix/blob/master/console/main_console.cpp): `console/main_console.cpp`
- [Batch conversion](https://github.com/rordenlab/dcm2niix/blob/master/console/nii_dicom_batch.cpp): `console/nii_dicom_batch.cpp`
- [Python wrapper](https://github.com/rordenlab/dcm2niix/blob/master/dcm2niix/__init__.py): `dcm2niix/__init__.py`

### DICOM processing

- [DICOM parser](https://github.com/rordenlab/dcm2niix/blob/master/console/nii_dicom.cpp): `console/nii_dicom.cpp`
- [Fragment reassembly](https://github.com/rordenlab/dcm2niix/blob/master/console/dicom_fragments.cpp): `console/dicom_fragments.cpp`
- [JPEG decoding](https://github.com/rordenlab/dcm2niix/blob/master/console/ujpeg.cpp): `console/ujpeg.cpp`
- [JPEG-LS decoding](https://github.com/rordenlab/dcm2niix/blob/master/console/charls/jpegls.cpp): `console/charls/jpegls.cpp`
- [JPEG lossless](https://github.com/rordenlab/dcm2niix/blob/master/console/jpg_0XC3.cpp): `console/jpg_0XC3.cpp`
- [Image codecs](https://github.com/rordenlab/dcm2niix/blob/master/console/nii_foreign.cpp): `console/nii_foreign.cpp`

### Conversion outputs

- [NIfTI I/O](https://github.com/rordenlab/dcm2niix/blob/master/console/nifti1_io_core.cpp): `console/nifti1_io_core.cpp`
- [Image orientation](https://github.com/rordenlab/dcm2niix/blob/master/console/nii_ortho.cpp): `console/nii_ortho.cpp`
- [Metadata sidecars](https://github.com/rordenlab/dcm2niix/blob/master/console/nii_dicom.cpp): `console/nii_dicom.cpp`

### BIDS extensions

- [Physiology export](https://github.com/rordenlab/dcm2niix/blob/master/console/nii_dicom.cpp): `console/nii_dicom.cpp`
- [Spectroscopy export](https://github.com/rordenlab/dcm2niix/blob/master/console/nii_dicom.cpp): `console/nii_dicom.cpp`
- [ReproIn naming](https://github.com/rordenlab/dcm2niix/blob/master/console/reproin.cpp): `console/reproin.cpp`
- [Cross-series BIDS](https://github.com/rordenlab/dcm2niix/blob/master/tools/reproinx.py): `tools/reproinx.py`

### Browser runtime

- [Browser API](https://github.com/rordenlab/dcm2niix/blob/master/js/src/index.js): `js/src/index.js`
- [WASM worker](https://github.com/rordenlab/dcm2niix/blob/master/js/src/worker.js): `js/src/worker.js`
- [WASM converter](https://github.com/rordenlab/dcm2niix/blob/master/js/src/worker.js): `js/src/worker.js`

### Other components

- **Operator**
- **DICOM files**
- **NIfTI and sidecars**
- **BIDS dataset**
- **Browser files**
- **Browser outputs**

## Connections

- Operator → CLI entry: runs
- DICOM files → Batch conversion: supplies
- CLI entry → Batch conversion: starts
- Batch conversion → DICOM parser: dispatches
- DICOM parser → Fragment reassembly: reassembles
- DICOM parser → JPEG decoding: decodes
- DICOM parser → JPEG-LS decoding: decodes
- DICOM parser → JPEG lossless: decodes
- DICOM parser → Image codecs: decodes
- DICOM parser → NIfTI I/O: writes images
- DICOM parser → Image orientation: transforms images
- DICOM parser → Metadata sidecars: writes metadata
- DICOM parser → Physiology export: extracts streams
- DICOM parser → Spectroscopy export: converts spectra
- NIfTI I/O → NIfTI and sidecars: writes images
- Metadata sidecars → NIfTI and sidecars: writes sidecars
- Physiology export → NIfTI and sidecars: writes recordings
- Spectroscopy export → NIfTI and sidecars: writes spectra
- DICOM parser → ReproIn naming: names outputs
- NIfTI and sidecars → Cross-series BIDS: post-processes
- Cross-series BIDS → BIDS dataset: updates dataset
- Operator → Python wrapper: invokes
- Python wrapper → CLI entry: runs binary
- Operator → Browser API: submits files
- Browser API → WASM worker: sends files and options
- Browser files → WASM worker: provides input
- WASM worker → WASM converter: invokes
- WASM converter → Browser outputs: produces files
