Full Code of nipreps/mriqc for AI

master c030ac1919de cached
173 files
17.6 MB
570.4k tokens
371 symbols
1 requests
Download .txt
Showing preview only (1,641K chars total). Download the full file or copy to clipboard to get everything.
Repository: nipreps/mriqc
Branch: master
Commit: c030ac1919de
Files: 173
Total size: 17.6 MB

Directory structure:
gitextract_jfsbcv57/

├── .circleci/
│   ├── circle_T1w.txt
│   ├── circle_bold.txt
│   └── config.yml
├── .codecov.yml
├── .dockerignore
├── .git_archival.txt
├── .gitattributes
├── .github/
│   ├── config.yml
│   ├── dependabot.yml
│   └── workflows/
│       └── pythonpackage.yml
├── .gitignore
├── .mailmap
├── .maint/
│   ├── CONTRIBUTORS.md
│   ├── FORMER.md
│   ├── MAINTAINERS.md
│   ├── PIs.md
│   ├── ROADMAP.md
│   ├── requirements.txt
│   ├── update_authors.py
│   └── update_changes.sh
├── .readthedocs.yaml
├── .zenodo.json
├── AGENTS.md
├── CHANGES.rst
├── Dockerfile
├── Dockerfile_devel
├── LICENSE
├── MANIFEST.in
├── Makefile
├── README.rst
├── docker/
│   └── files/
│       └── neurodebian.gpg
├── docs/
│   ├── Makefile
│   ├── notebooks/
│   │   ├── .gitignore
│   │   ├── MRIQC Web API.ipynb
│   │   ├── Paper-v1.0.ipynb
│   │   ├── Paper-v2.0.ipynb
│   │   ├── SpikesPlotter.ipynb
│   │   ├── Supplemental Materials.ipynb
│   │   └── finding_spikes.ipynb
│   └── source/
│       ├── _static/
│       │   ├── bold-1subject-1task.html
│       │   ├── bold-1subject-8tasks.html
│       │   ├── example_anatreport.html
│       │   └── example_funcreport.html
│       ├── about.rst
│       ├── changes.rst
│       ├── conf.py
│       ├── dsa.rst
│       ├── index.rst
│       ├── install.rst
│       ├── iqms/
│       │   ├── bold.rst
│       │   ├── dwi.rst
│       │   └── t1w.rst
│       ├── license.rst
│       ├── measures.rst
│       ├── reports/
│       │   ├── bold.rst
│       │   ├── group.rst
│       │   └── smri.rst
│       ├── reports.rst
│       ├── resources/
│       │   ├── mriqc.sbatch
│       │   └── sbatch.sh
│       ├── usage.rst
│       └── workflows.rst
├── long_description.rst
├── mriqc/
│   ├── __init__.py
│   ├── __main__.py
│   ├── _warnings.py
│   ├── bin/
│   │   ├── __init__.py
│   │   ├── abide2bids.py
│   │   ├── dfcheck.py
│   │   ├── fs2gif.py
│   │   ├── labeler.py
│   │   ├── messages.py
│   │   ├── mriqcwebapi_test.py
│   │   ├── nib_hash.py
│   │   └── subject_wrangler.py
│   ├── cli/
│   │   ├── __init__.py
│   │   ├── parser.py
│   │   ├── run.py
│   │   ├── version.py
│   │   └── workflow.py
│   ├── config.py
│   ├── conftest.py
│   ├── data/
│   │   ├── NOTICE
│   │   ├── __init__.py
│   │   ├── bootstrap-anat.yml
│   │   ├── bootstrap-dwi.yml
│   │   ├── bootstrap-func.yml
│   │   ├── config-example.toml
│   │   ├── config.py
│   │   ├── fsexport.tcl
│   │   ├── itk_identity.tfm
│   │   ├── reports/
│   │   │   ├── embed_resources/
│   │   │   │   ├── boxplots.css
│   │   │   │   └── boxplots.js
│   │   │   ├── group.html
│   │   │   └── resources/
│   │   │       ├── DO_NOT_REMOVE_OR_MODIFY
│   │   │       ├── boxplots.css
│   │   │       └── boxplots.js
│   │   ├── testdata/
│   │   │   ├── group_T1w.tsv
│   │   │   └── group_bold.tsv
│   │   └── tests/
│   │       ├── ds000005/
│   │       │   ├── CHANGES
│   │       │   ├── README
│   │       │   ├── dataset_description.json
│   │       │   ├── participants.tsv
│   │       │   ├── sub-01/
│   │       │   │   └── func/
│   │       │   │       ├── sub-01_task-mixedgamblestask_run-01_bold.json
│   │       │   │       ├── sub-01_task-mixedgamblestask_run-01_events.tsv
│   │       │   │       ├── sub-01_task-mixedgamblestask_run-02_events.tsv
│   │       │   │       └── sub-01_task-mixedgamblestask_run-03_events.tsv
│   │       │   └── task-mixedgamblestask_bold.json
│   │       ├── ds002785/
│   │       │   ├── dataset_description.json
│   │       │   ├── sub-0017/
│   │       │   │   └── anat/
│   │       │   │       └── sub-0017_T1w.json
│   │       │   └── sub-0042/
│   │       │       └── anat/
│   │       │           └── sub-0042_T1w.json
│   │       ├── gh1086-ds004134.oracle
│   │       ├── gh921-dmd-20220428-0.oracle
│   │       └── gh921-dmd-20230319-0.oracle
│   ├── engine/
│   │   ├── __init__.py
│   │   └── plugin.py
│   ├── instrumentation/
│   │   ├── __init__.py
│   │   ├── __main__.py
│   │   ├── resources.py
│   │   └── viz.py
│   ├── interfaces/
│   │   ├── __init__.py
│   │   ├── anatomical.py
│   │   ├── bids.py
│   │   ├── common/
│   │   │   ├── __init__.py
│   │   │   ├── conform_image.py
│   │   │   └── ensure_size.py
│   │   ├── diffusion.py
│   │   ├── functional.py
│   │   ├── reports.py
│   │   ├── synthstrip.py
│   │   ├── tests/
│   │   │   └── test_interfaces.py
│   │   ├── transitional.py
│   │   └── webapi.py
│   ├── messages.py
│   ├── qc/
│   │   ├── __init__.py
│   │   ├── anatomical.py
│   │   ├── diffusion.py
│   │   ├── functional.py
│   │   └── tests/
│   │       ├── __init__.py
│   │       ├── test_anatomical.py
│   │       └── test_diffusion.py
│   ├── reports/
│   │   ├── __init__.py
│   │   ├── group.py
│   │   └── individual.py
│   ├── synthstrip/
│   │   ├── ORIGINAL_LICENSE
│   │   ├── __init__.py
│   │   ├── __main__.py
│   │   ├── cli.py
│   │   └── model.py
│   ├── testing.py
│   ├── tests/
│   │   ├── test_config.py
│   │   ├── test_main.py
│   │   ├── test_parser.py
│   │   └── test_reports.py
│   ├── utils/
│   │   ├── __init__.py
│   │   ├── bids.py
│   │   ├── debug.py
│   │   ├── misc.py
│   │   └── telemetry.py
│   └── workflows/
│       ├── __init__.py
│       ├── anatomical/
│       │   ├── __init__.py
│       │   ├── base.py
│       │   └── output.py
│       ├── core.py
│       ├── diffusion/
│       │   ├── __init__.py
│       │   ├── base.py
│       │   └── output.py
│       ├── functional/
│       │   ├── __init__.py
│       │   ├── base.py
│       │   └── output.py
│       ├── shared.py
│       └── utils.py
└── pyproject.toml

================================================
FILE CONTENTS
================================================

================================================
FILE: .circleci/circle_T1w.txt
================================================
.bids_db
.bids_db/layout_index.sqlite
.bidsignore
dataset_description.json
group_T1w.html
group_T1w.tsv
logs
logs/config-18480913-163000_PhineasG-ageh-adhi-sacc-ident9b1ab0f.toml
logs/mriqc-18480913-163000_PhineasG-ageh-adhi-sacc-ident9b1ab0f.log
sub-50137
sub-50137/anat
sub-50137/anat/sub-50137_T1w.json
sub-50137/figures
sub-50137/figures/sub-50137_desc-airmask_T1w.svg
sub-50137/figures/sub-50137_desc-artifacts_T1w.svg
sub-50137/figures/sub-50137_desc-background_T1w.svg
sub-50137/figures/sub-50137_desc-brainmask_T1w.svg
sub-50137/figures/sub-50137_desc-head_T1w.svg
sub-50137/figures/sub-50137_desc-noisefit_T1w.svg
sub-50137/figures/sub-50137_desc-norm_T1w.svg
sub-50137/figures/sub-50137_desc-segmentation_T1w.svg
sub-50137/figures/sub-50137_desc-zoomed_T1w.svg
sub-50137_T1w.html
sub-50152
sub-50152/anat
sub-50152/anat/sub-50152_T1w.json
sub-50152/figures
sub-50152/figures/sub-50152_desc-airmask_T1w.svg
sub-50152/figures/sub-50152_desc-artifacts_T1w.svg
sub-50152/figures/sub-50152_desc-background_T1w.svg
sub-50152/figures/sub-50152_desc-brainmask_T1w.svg
sub-50152/figures/sub-50152_desc-head_T1w.svg
sub-50152/figures/sub-50152_desc-noisefit_T1w.svg
sub-50152/figures/sub-50152_desc-norm_T1w.svg
sub-50152/figures/sub-50152_desc-segmentation_T1w.svg
sub-50152/figures/sub-50152_desc-zoomed_T1w.svg
sub-50152_T1w.html
sub-50785
sub-50785/anat
sub-50785/anat/sub-50785_T1w.json
sub-50785/figures
sub-50785/figures/sub-50785_desc-airmask_T1w.svg
sub-50785/figures/sub-50785_desc-artifacts_T1w.svg
sub-50785/figures/sub-50785_desc-background_T1w.svg
sub-50785/figures/sub-50785_desc-brainmask_T1w.svg
sub-50785/figures/sub-50785_desc-head_T1w.svg
sub-50785/figures/sub-50785_desc-noisefit_T1w.svg
sub-50785/figures/sub-50785_desc-norm_T1w.svg
sub-50785/figures/sub-50785_desc-segmentation_T1w.svg
sub-50785/figures/sub-50785_desc-zoomed_T1w.svg
sub-50785_T1w.html
sub-51187
sub-51187/anat
sub-51187/anat/sub-51187_T1w.json
sub-51187/figures
sub-51187/figures/sub-51187_desc-airmask_T1w.svg
sub-51187/figures/sub-51187_desc-artifacts_T1w.svg
sub-51187/figures/sub-51187_desc-background_T1w.svg
sub-51187/figures/sub-51187_desc-brainmask_T1w.svg
sub-51187/figures/sub-51187_desc-head_T1w.svg
sub-51187/figures/sub-51187_desc-noisefit_T1w.svg
sub-51187/figures/sub-51187_desc-norm_T1w.svg
sub-51187/figures/sub-51187_desc-segmentation_T1w.svg
sub-51187/figures/sub-51187_desc-zoomed_T1w.svg
sub-51187_T1w.html
/tmp/t1w/derivatives


================================================
FILE: .circleci/circle_bold.txt
================================================
.bids_db
.bids_db/layout_index.sqlite
.bidsignore
dataset_description.json
group_bold.html
group_bold.tsv
logs
logs/config-18480913-163000_PhineasG-ageh-adhi-sacc-ident9b1ab0f.toml
logs/mriqc-18480913-163000_PhineasG-ageh-adhi-sacc-ident9b1ab0f.log
sub-ds205s03
sub-ds205s03/figures
sub-ds205s03/figures/sub-ds205s03_task-functionallocalizer_run-01_desc-background_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-functionallocalizer_run-01_desc-brainmask_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-functionallocalizer_run-01_desc-carpet_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-functionallocalizer_run-01_desc-mean_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-functionallocalizer_run-01_desc-norm_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-functionallocalizer_run-01_desc-stdev_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-functionallocalizer_run-01_desc-zoomed_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-view_run-01_desc-background_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-view_run-01_desc-brainmask_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-view_run-01_desc-carpet_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-view_run-01_desc-mean_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-view_run-01_desc-norm_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-view_run-01_desc-stdev_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-view_run-01_desc-zoomed_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-view_run-02_desc-background_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-view_run-02_desc-brainmask_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-view_run-02_desc-carpet_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-view_run-02_desc-mean_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-view_run-02_desc-norm_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-view_run-02_desc-stdev_bold.svg
sub-ds205s03/figures/sub-ds205s03_task-view_run-02_desc-zoomed_bold.svg
sub-ds205s03/func
sub-ds205s03/func/sub-ds205s03_task-functionallocalizer_run-01_bold.json
sub-ds205s03/func/sub-ds205s03_task-functionallocalizer_run-01_timeseries.json
sub-ds205s03/func/sub-ds205s03_task-functionallocalizer_run-01_timeseries.tsv
sub-ds205s03/func/sub-ds205s03_task-view_run-01_bold.json
sub-ds205s03/func/sub-ds205s03_task-view_run-01_timeseries.json
sub-ds205s03/func/sub-ds205s03_task-view_run-01_timeseries.tsv
sub-ds205s03/func/sub-ds205s03_task-view_run-02_bold.json
sub-ds205s03/func/sub-ds205s03_task-view_run-02_timeseries.json
sub-ds205s03/func/sub-ds205s03_task-view_run-02_timeseries.tsv
sub-ds205s03_task-functionallocalizer_run-01_bold.html
sub-ds205s03_task-view_run-01_bold.html
sub-ds205s03_task-view_run-02_bold.html
sub-ds205s07
sub-ds205s07/figures
sub-ds205s07/figures/sub-ds205s07_task-functionallocalizer_run-01_desc-background_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-functionallocalizer_run-01_desc-brainmask_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-functionallocalizer_run-01_desc-carpet_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-functionallocalizer_run-01_desc-mean_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-functionallocalizer_run-01_desc-norm_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-functionallocalizer_run-01_desc-stdev_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-functionallocalizer_run-01_desc-zoomed_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-view_run-01_desc-background_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-view_run-01_desc-brainmask_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-view_run-01_desc-carpet_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-view_run-01_desc-mean_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-view_run-01_desc-norm_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-view_run-01_desc-stdev_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-view_run-01_desc-zoomed_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-view_run-02_desc-background_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-view_run-02_desc-brainmask_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-view_run-02_desc-carpet_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-view_run-02_desc-mean_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-view_run-02_desc-norm_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-view_run-02_desc-stdev_bold.svg
sub-ds205s07/figures/sub-ds205s07_task-view_run-02_desc-zoomed_bold.svg
sub-ds205s07/func
sub-ds205s07/func/sub-ds205s07_task-functionallocalizer_run-01_bold.json
sub-ds205s07/func/sub-ds205s07_task-functionallocalizer_run-01_timeseries.json
sub-ds205s07/func/sub-ds205s07_task-functionallocalizer_run-01_timeseries.tsv
sub-ds205s07/func/sub-ds205s07_task-view_run-01_bold.json
sub-ds205s07/func/sub-ds205s07_task-view_run-01_timeseries.json
sub-ds205s07/func/sub-ds205s07_task-view_run-01_timeseries.tsv
sub-ds205s07/func/sub-ds205s07_task-view_run-02_bold.json
sub-ds205s07/func/sub-ds205s07_task-view_run-02_timeseries.json
sub-ds205s07/func/sub-ds205s07_task-view_run-02_timeseries.tsv
sub-ds205s07_task-functionallocalizer_run-01_bold.html
sub-ds205s07_task-view_run-01_bold.html
sub-ds205s07_task-view_run-02_bold.html
sub-ds205s09
sub-ds205s09/figures
sub-ds205s09/figures/sub-ds205s09_task-view_acq-LR_run-01_desc-background_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-LR_run-01_desc-brainmask_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-LR_run-01_desc-carpet_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-LR_run-01_desc-mean_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-LR_run-01_desc-norm_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-LR_run-01_desc-stdev_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-LR_run-01_desc-zoomed_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-LR_run-02_desc-background_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-LR_run-02_desc-brainmask_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-LR_run-02_desc-carpet_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-LR_run-02_desc-mean_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-LR_run-02_desc-norm_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-LR_run-02_desc-stdev_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-LR_run-02_desc-zoomed_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-RL_run-01_desc-background_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-RL_run-01_desc-brainmask_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-RL_run-01_desc-carpet_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-RL_run-01_desc-mean_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-RL_run-01_desc-norm_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-RL_run-01_desc-stdev_bold.svg
sub-ds205s09/figures/sub-ds205s09_task-view_acq-RL_run-01_desc-zoomed_bold.svg
sub-ds205s09/func
sub-ds205s09/func/sub-ds205s09_task-view_acq-LR_run-01_bold.json
sub-ds205s09/func/sub-ds205s09_task-view_acq-LR_run-01_timeseries.json
sub-ds205s09/func/sub-ds205s09_task-view_acq-LR_run-01_timeseries.tsv
sub-ds205s09/func/sub-ds205s09_task-view_acq-LR_run-02_bold.json
sub-ds205s09/func/sub-ds205s09_task-view_acq-LR_run-02_timeseries.json
sub-ds205s09/func/sub-ds205s09_task-view_acq-LR_run-02_timeseries.tsv
sub-ds205s09/func/sub-ds205s09_task-view_acq-RL_run-01_bold.json
sub-ds205s09/func/sub-ds205s09_task-view_acq-RL_run-01_timeseries.json
sub-ds205s09/func/sub-ds205s09_task-view_acq-RL_run-01_timeseries.tsv
sub-ds205s09_task-view_acq-LR_run-01_bold.html
sub-ds205s09_task-view_acq-LR_run-02_bold.html
sub-ds205s09_task-view_acq-RL_run-01_bold.html
/tmp/bold/derivatives


================================================
FILE: .circleci/config.yml
================================================
version: 2.1
orbs:
  docker: circleci/docker@2.1.4

jobs:
  build:
    environment:
      - TZ: "/usr/share/zoneinfo/America/Los_Angeles"
      - MRIQC_API_TAG: 1.1.1
      - MRIQC_API_DOCKER_IMAGES: "nginx:1.26.2 swaggerapi/swagger-ui:v5.17.14 mongo:6.0.15
          python:3.7-slim-bullseye"
      - DOCKER_BUILDKIT: 1
    machine:
      # https://discuss.circleci.com/t/linux-machine-executor-images-2021-april-q2-update/39928
      # upgrade Docker version
      image: default
      docker_layer_caching: true
    working_directory: /tmp/src/mriqc
    steps:
      - checkout
      - persist_to_workspace:
          root: /tmp
          paths:
            - src/mriqc
      - run:
          name: Check whether build should be skipped
          command: |
            if [[ "$( git log --format='format:%s' -n 1 $CIRCLE_SHA1 | grep -i -E '^docs?(\(\w+\))?:' )" != "" ]]; then
              echo "Only docs build"
              circleci step halt
            fi
      - restore_cache:
          keys:
            - build-v4-{{ .Branch }}-{{ .Revision }}
            - build-v4--{{ .Revision }}
            - build-v4-{{ .Branch }}-
            - build-v4-master-
            - build-v4-
          paths:
            - /tmp/docker
            - /tmp/images
      - docker/install-docker-credential-helper
      - run:
          name: Docker authentication
          command: |
            if [[ -n $DOCKER_PAT ]]; then
              echo "$DOCKER_PAT" | docker login -u $DOCKER_USER --password-stdin
            fi
      - run:
          name: Set up Docker registry
          command: |
            if [[ -f /tmp/images/registry.tar.gz ]]; then
              echo "Loading saved registry image"
              docker load < /tmp/images/registry.tar.gz
            else
              echo "Pulling registry image from DockerHub"
              docker pull registry:2
              mkdir -p /tmp/images
              docker save registry:2 | gzip > /tmp/images/registry.tar.gz
            fi
            docker run -d -p 5000:5000 --restart=always --name=registry \
                -v /tmp/docker:/var/lib/registry registry:2
      - run:
          name: Pull images
          command: |
            set +e
            docker pull localhost:5000/miniconda
            success=$?
            set -e
            if [[ "$success" = "0" ]]; then
                echo "Pulling from local registry"
                docker tag localhost:5000/miniconda nipreps/miniconda:py39_2403.0
                docker pull localhost:5000/mriqc
                docker tag localhost:5000/mriqc nipreps/mriqc:latest
                docker tag localhost:5000/mriqc nipreps/mriqc
            else
                echo "Pulling from Docker Hub"
                docker pull nipreps/miniconda:py39_2403.0
                docker tag nipreps/miniconda:py39_2403.0 localhost:5000/miniconda
                docker push localhost:5000/miniconda
                docker pull nipreps/mriqc:latest
            fi

      - run:
          name: MRIQCWebAPI - Pull Docker images
          command: |
            webapi_images=($MRIQC_API_DOCKER_IMAGES)
            for image in ${webapi_images[@]}; do
                set +e
                docker pull localhost:5000/${image}
                success=$?
                set -e
                if [[ "$success" = "0" ]]; then
                    docker tag localhost:5000/${image} ${image}
                else
                    docker pull ${image}
                    docker tag ${image} localhost:5000/${image}
                    docker push localhost:5000/${image}
                fi
            done;

      - run:
          name: Prepare MRIQCWebAPI
          command: |
            set +e
            docker pull localhost:5000/dockereve-master-endpoints:latest
            success=$?
            set -e
            if [[ "$success" = 0 ]]; then
                docker tag localhost:5000/dockereve-master-endpoints:latest dockereve-master-endpoints:latest
            fi

            rm -rf /tmp/src/mriqcwebapi
            git clone https://github.com/nipreps/mriqcwebapi.git /tmp/src/mriqcwebapi
            cd /tmp/src/mriqcwebapi
            git checkout ${MRIQC_API_TAG}
            if [ "${MRIQC_API_SECRET_TOKEN}" != "" ]; then
              sed -i -E "s/<secret_token>/$MRIQC_API_SECRET_TOKEN/" dockereve-master/.env
              grep -q -i $MRIQC_API_SECRET_TOKEN dockereve-master/.env
            fi
            sed -i -E \
              -e 's#image: nginx:latest#image: nginx:1.26.2#' \
              -e 's#image: swaggerapi/swagger-ui:latest#image: swaggerapi/swagger-ui:v5.17.14#' \
              -e 's#image: mongo:latest#image: mongo:6.0.15#' \
              dockereve-master/docker-compose.yml
            docker-compose -f /tmp/src/mriqcwebapi/dockereve-master/docker-compose.yml pull
            docker-compose -f /tmp/src/mriqcwebapi/dockereve-master/docker-compose.yml build

            docker tag dockereve-master-endpoints:latest localhost:5000/dockereve-master-endpoints:latest
            docker push localhost:5000/dockereve-master-endpoints:latest
      - run:
          name: Build Docker image
          no_output_timeout: 60m
          command: |
            pyenv local 3
            pip install hatch

            # Get version before making repo dirty
            THISVERSION=$( hatch version )

            # Inject MRIQC-WebAPI secret
            if [ "${MRIQC_API_SECRET_TOKEN}" != "" ]; then
              sed -i -E "s/<secret_token>/$MRIQC_API_SECRET_TOKEN/" mriqc/config.py
              grep -q -i $MRIQC_API_SECRET_TOKEN mriqc/config.py
            fi

            if [[ ${THISVERSION:0:1} == "0" ]] ; then
              echo "WARNING: latest git tag could not be found"
              echo "Please, make sure you fetch all tags from upstream with"
              echo "the command ``git fetch --tags --verbose`` and push"
              echo "them to your fork with ``git push origin --tags``"
            fi

            echo "Building version: $THISVERSION."

            # Build docker image
            e=1 && for i in {1..5}; do
              docker build \
                --cache-from=nipreps/mriqc \
                -t nipreps/mriqc:latest \
                --build-arg BUILD_DATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \
                --build-arg VCS_REF=`git rev-parse --short HEAD` \
                --build-arg VERSION="${CIRCLE_TAG:-$THISVERSION}" . \
              && e=0 && break || sleep 15
            done && [ "$e" -eq "0" ]

            TARGET_VERSION="${CIRCLE_TAG:-$THISVERSION}"
            TARGET_VERSION="MRIQC v${TARGET_VERSION%+*}"
            DOCKER_VERSION=$( docker run --rm nipreps/mriqc:latest --version )
            DOCKER_VERSION="${DOCKER_VERSION%+*}"
            echo "Target version: \"${TARGET_VERSION}\""
            echo "Docker version: \"${DOCKER_VERSION}\""
            test "${TARGET_VERSION}" == "$DOCKER_VERSION"
      - run:
          name: Docker push to local registry
          no_output_timeout: 40m
          command: |
            docker tag nipreps/mriqc:latest localhost:5000/mriqc
            docker push localhost:5000/mriqc
            webapi_images=($MRIQC_API_DOCKER_IMAGES)
            for image in ${webapi_images[@]}; do
                docker tag ${image} localhost:5000/${image}
                docker push localhost:5000/${image}
            done
      - run:
          name: Docker registry garbage collection
          command: |
            docker exec -it registry /bin/registry garbage-collect --delete-untagged \
              /etc/docker/registry/config.yml
      - save_cache:
          key: build-v4-{{ .Branch }}-{{ .Revision }}
          paths:
            - /tmp/docker
            - /tmp/images
      - persist_to_workspace:
          root: /tmp
          paths:
            - src/mriqc
            - src/mriqcwebapi

  get_data:
    machine:
      image: ubuntu-2204:2023.02.1
    environment:
      - TZ: "/usr/share/zoneinfo/America/Los_Angeles"
      - TEST_DATA_NAME: "circle-tests"
      - TEST_DATA_URL: "https://files.osf.io/v1/resources/fvuh8/providers/osfstorage/5b\
          6c9950fed49e001a7885b6"
    working_directory: /home/circleci/data
    steps:
      - checkout:
          path: /tmp/src/mriqc
      - run:
          name: Check whether build should be skipped
          command: |
            cd /tmp/src/mriqc
            if [[ "$( git log --format='format:%s' -n 1 $CIRCLE_SHA1 | grep -i -E '^docs?(\(\w+\))?:' )" != "" ]]; then
              echo "Only docs build"
              circleci step halt
            fi
      - restore_cache:
          keys:
            - data-v2-{{ epoch }}
            - data-v2-
      - run:
          name: Get test data
          command: |
            mkdir -p /tmp/data
            if [[ ! -d /tmp/data/${TEST_DATA_NAME} ]]; then
              wget --retry-connrefused --waitretry=5 --read-timeout=20 --timeout=15 -t 0 -q \
                -O ${TEST_DATA_NAME}.tar.gz "${TEST_DATA_URL}"
              tar xvzf ${TEST_DATA_NAME}.tar.gz -C /tmp/data/
            else
              echo "Dataset ${TEST_DATA_NAME} was cached"
            fi
      - run:
          name: Create Nipype config files
          command: |
            mkdir -p /tmp/t1w /tmp/bold
            printf "[execution]\nstop_on_first_crash = true\n" > /tmp/t1w/nipype.cfg
            echo "poll_sleep_duration = 0.01" >> /tmp/t1w/nipype.cfg
            echo "hash_method = content" >> /tmp/t1w/nipype.cfg
            cp /tmp/t1w/nipype.cfg /tmp/bold/nipype.cfg
      - save_cache:
          key: data-v2-{{ epoch }}
          paths:
            - /tmp/data
            - /tmp/t1w
            - /tmp/bold

  test_pytest:
    machine:
      image: ubuntu-2204:2023.02.1
    working_directory: /home/circleci/out/tests
    steps:
      - attach_workspace:
          at: /tmp
      - run:
          name: Check whether build should be skipped
          command: |
            cd /tmp/src/mriqc
            if [[ "$( git log --format='format:%s' -n 1 $CIRCLE_SHA1 | grep -i -E '^docs?(\(\w+\))?:' )" != "" ]]; then
              echo "Only docs build"
              circleci step halt
            fi
            if [[ "$( git log --format=oneline -n 1 $CIRCLE_SHA1 | grep -i -E '\[only[ _]?(anat|func|smoke)\]' )" != "" ]]; then
              echo "Only smoke-tests build"
              circleci step halt
            fi
      - restore_cache:
          keys:
            - build-v4-{{ .Branch }}-{{ .Revision }}
          paths:
            - /tmp/docker
            - /tmp/images
      - docker/install-docker-credential-helper
      - run:
          name: Docker authentication
          command: |
            if [[ -n $DOCKER_PAT ]]; then
              echo "$DOCKER_PAT" | docker login -u $DOCKER_USER --password-stdin
            fi
      - run:
          name: Set-up a Docker registry
          command: |
            if [[ -f /tmp/images/registry.tar.gz ]]; then
              echo "Loading saved registry image"
              docker load < /tmp/images/registry.tar.gz
            else
              echo "Pulling registry image from DockerHub"
              docker pull registry:2
            fi
            docker run -d -p 5000:5000 --restart=always --name=registry \
                -v /tmp/docker:/var/lib/registry registry:2
      - run:
          name: Pull images from local registry
          command: |
            docker pull localhost:5000/mriqc
            docker tag localhost:5000/mriqc nipreps/mriqc:latest
      - run:
          name: Generate _version.py
          command: |
            python3 -m pip install build

            pushd /tmp/src/mriqc
            python3 -m build
            popd
      - run:
          name: Run MRIQC tests
          no_output_timeout: 2h
          command: |
            docker run --rm -ti -v $PWD:/scratch --entrypoint="pytest" \
              -v /tmp/src:/src -w /src/mriqc \
              nipreps/mriqc:latest mriqc \
              --junitxml=/scratch/tests.xml \
              --doctest-modules --ignore=mriqc/bin \
              --ignore=mriqc/interfaces/transitional.py
      - store_test_results:
          path: /home/circleci/out/tests

  T1w:
    environment:
      - TZ: "/usr/share/zoneinfo/America/Los_Angeles"
      - TEST_DATA_NAME: "circle-tests"
      - MRIQC_API_DOCKER_IMAGES: "nginx:1.26.2 swaggerapi/swagger-ui:v5.17.14 mongo:6.0.15
          python:3.7-slim-bullseye dockereve-master-endpoints:latest"
      - MIGAS_OPTOUT: "1"
    machine:
      # https://discuss.circleci.com/t/linux-machine-executor-images-2021-april-q2-update/39928
      # upgrade Docker version
      image: ubuntu-2204:2023.02.1
    resource_class: large
    working_directory: /tmp/t1w
    steps:
      - attach_workspace:
          at: /tmp
      - run:
          name: Check whether build should be skipped
          command: |
            cd /tmp/src/mriqc
            if [[ "$( git log --format='format:%s' -n 1 $CIRCLE_SHA1 | grep -i -E '^docs?(\(\w+\))?:' )" != "" ]]; then
              echo "Only docs build"
              circleci step halt
            fi
            if [[ "$( git log --format=oneline -n 1 $CIRCLE_SHA1 | grep -i -E '\[only[ _]?func\]' )" != "" ]]; then
              echo "Only functional smoke-tests build"
              circleci step halt
            fi
      - restore_cache:
          keys:
            - build-v4-{{ .Branch }}-{{ .Revision }}
          paths:
            - /tmp/docker
            - /tmp/images
      - run:
          name: Set-up a Docker registry
          command: |
            if [[ -f /tmp/images/registry.tar.gz ]]; then
              echo "Loading saved registry image"
              docker load < /tmp/images/registry.tar.gz
            else
              echo "Pulling registry image from DockerHub"
              docker pull registry:2
            fi
            docker run -d --restart=always --name=registry \
                -e REGISTRY_HTTP_ADDR=0.0.0.0:5001 -p 5001:5001 \
                -v /tmp/docker:/var/lib/registry registry:2
      - run:
          name: Pull images from local registry
          command: |
            docker pull localhost:5001/mriqc
            docker tag localhost:5001/mriqc nipreps/mriqc:latest

            webapi_images=($MRIQC_API_DOCKER_IMAGES)
            for image in ${webapi_images[@]}; do
                docker pull localhost:5001/${image}
                docker tag localhost:5001/${image} ${image}
            done;
      - run:
          name: Start MRIQC WebAPI endpoint
          command: |
            docker-compose -f /tmp/src/mriqcwebapi/dockereve-master/docker-compose.yml --verbose up -d
          background: true
      - restore_cache:
          keys:
            - data-v2-{{ epoch }}
            - data-v2-
      - restore_cache:
          keys:
            - t1w-v6-{{ .Branch }}
            - t1w-v6-master
            - t1w-v6-

      - run:
          name: Remove old, cached configs
          command: |
            rm -f /tmp/t1w/work/.mriqc.*.toml
            rm -f /tmp/t1w/work/.resources.*.tsv
            rm -f /tmp/t1w/work/.resources.*.png

      - run:
          name: Run participant-level on T1w images
          no_output_timeout: 2h
          command: |
            mkdir -p /tmp/t1w/work /tmp/t1w/derivatives
            # Run MRIQC
            docker run -u $( id -u ) --rm -ti \
                       -v /tmp/data/${TEST_DATA_NAME}:/data:ro \
                       -v /tmp/t1w:/scratch -w /scratch \
                       -e MRIQC_DEV=1 \
                       nipreps/mriqc:latest \
                       /data derivatives/ participant \
                       -vv --verbose-reports --profile -m T1w --dsname circletests \
                       --resource-monitor \
                       --n_procs 2 --ants-nthreads 1 --ants-float \
                       --webapi-url http://$( hostname -I | awk '{print $1}' )/api/v1 --upload-strict

      - run:
          name: Move temporary but relevant artifacts
          command: |
            mkdir /tmp/t1w/misc
            mv /tmp/t1w/work/.resources.*.tsv /tmp/t1w/misc
            mv /tmp/t1w/work/.resources.*.png /tmp/t1w/misc

      - store_artifacts:
          path: /tmp/t1w/misc

      - save_cache:
          key: t1w-v6-{{ .Branch }}
          paths:
            - /tmp/t1w/work

      - run:
          name: Run group-level on T1w images
          no_output_timeout: 2h
          command: |
            docker run -u $( id -u ) --rm -ti \
                       -v /tmp/data/${TEST_DATA_NAME}:/data:ro \
                       -v /tmp/t1w:/scratch -w /scratch \
                       -e MRIQC_DEV=1 \
                       nipreps/mriqc:latest \
                       /data derivatives/ group \
                       -m T1w -vv

      - store_artifacts:
          path: /tmp/t1w/derivatives

      - run:
          name: Checking presence of outputs
          command: |
            mkdir -p /tmp/t1w/test
            find /tmp/t1w/derivatives | sed s+/tmp/t1w/derivatives/++ | sort > /tmp/t1w/test/outputs.out
            diff /tmp/src/mriqc/.circleci/circle_T1w.txt /tmp/t1w/test/outputs.out
            exit $?

      - run:
          name: Clean-up work directory (just leave reports & commandlines)
          command: |
            find /tmp/t1w/work -type f -not -name "report.rst" -and -not -name "command.txt" -delete

      - store_artifacts:
          path: /tmp/t1w/work

      - run:
          name: Checking changes on IQMs
          command: |
            docker run --rm -ti -v $PWD:/scratch -w /scratch -v /tmp/src:/src \
              --entrypoint="dfcheck" nipreps/mriqc:latest \
              -i /scratch/derivatives/group_T1w.tsv \
              -r /src/mriqc/mriqc/data/testdata/group_T1w.tsv \
            || true  # ignore failure

      - run:
          name: WebAPI - Check records
          command: |
            docker run --rm -ti \
              --entrypoint="/opt/conda/bin/mriqcwebapi_test" \
              nipreps/mriqc:latest \
              T1w 4 \
              --webapi-url http://$( hostname -I | awk '{print $1}' )/api/v1/T1w

      - store_artifacts:
          path: /tmp/t1w/test

  bold:
    environment:
      - TZ: "/usr/share/zoneinfo/America/Los_Angeles"
      - TEST_DATA_NAME: "circle-tests"
      - MRIQC_API_DOCKER_IMAGES: "nginx:1.26.2 swaggerapi/swagger-ui:v5.17.14 mongo:6.0.15
          python:3.7-slim-bullseye dockereve-master-endpoints:latest"
      - MIGAS_OPTOUT: "1"
    machine:
      # https://discuss.circleci.com/t/linux-machine-executor-images-2021-april-q2-update/39928
      # upgrade Docker version
      image: ubuntu-2204:2023.02.1
    working_directory: /tmp/bold
    steps:
      - attach_workspace:
          at: /tmp
      - run:
          name: Check whether build should be skipped
          command: |
            cd /tmp/src/mriqc
            if [[ "$( git log --format='format:%s' -n 1 $CIRCLE_SHA1 | grep -i -E '^docs?(\(\w+\))?:' )" != "" ]]; then
              echo "Only docs build"
              circleci step halt
            fi
            if [[ "$( git log --format=oneline -n 1 $CIRCLE_SHA1 | grep -i -E '\[only[ _]?anat\]' )" != "" ]]; then
              echo "Only anatomical smoke-tests build"
              circleci step halt
            fi
      - restore_cache:
          keys:
            - build-v4-{{ .Branch }}-{{ .Revision }}
          paths:
            - /tmp/docker
            - /tmp/images
      - run:
          name: Set-up a Docker registry
          command: |
            if [[ -f /tmp/images/registry.tar.gz ]]; then
              echo "Loading saved registry image"
              docker load < /tmp/images/registry.tar.gz
            else
              echo "Pulling registry image from DockerHub"
              docker pull registry:2
            fi
            docker run -d --restart=always --name=registry \
                -e REGISTRY_HTTP_ADDR=0.0.0.0:5001 -p 5001:5001 \
                -v /tmp/docker:/var/lib/registry registry:2
      - run:
          name: Pull images from local registry
          command: |
            docker pull localhost:5001/mriqc
            docker tag localhost:5001/mriqc nipreps/mriqc:latest

            webapi_images=($MRIQC_API_DOCKER_IMAGES)
            for image in ${webapi_images[@]}; do
                docker pull localhost:5001/${image}
                docker tag localhost:5001/${image} ${image}
            done;
      - run:
          name: Start MRIQC WebAPI endpoint
          command: |
            docker-compose -f /tmp/src/mriqcwebapi/dockereve-master/docker-compose.yml --verbose up -d
          background: true

      - restore_cache:
          keys:
            - data-v2-{{ epoch }}
            - data-v2-
      - restore_cache:
          keys:
            - bold-v6-{{ .Branch }}
            - bold-v6-master
            - bold-v6-

      - run:
          name: Remove old, cached configs
          command: |
            rm -f /tmp/bold/work/.mriqc.*.toml
            rm -f /tmp/bold/work/.resources.*.tsv
            rm -f /tmp/bold/work/.resources.*.png

      - run:
          name: Run participant-level on BOLD images
          no_output_timeout: 2h
          command: |
            mkdir -p /tmp/bold/work /tmp/bold/derivatives
            # Run MRIQC
            docker run -u $( id -u ) --rm -ti -v /tmp/data/${TEST_DATA_NAME}:/data:ro \
                       -v $PWD:/scratch -w /scratch \
                       -e MRIQC_DEV=1 \
                       nipreps/mriqc:latest \
                       /data derivatives/ participant \
                       -vv --verbose-reports --profile -m bold --dsname circletests \
                       --n_procs 2 --ants-nthreads 1 --ants-float \
                       --resource-monitor --testing \
                       --webapi-url http://$( hostname -I | awk '{print $1}' )/api/v1 --upload-strict
      - run:
          name: Move temporary but relevant artifacts
          command: |
            mkdir /tmp/bold/misc
            mv /tmp/bold/work/.resources.*.tsv /tmp/bold/misc
            mv /tmp/bold/work/.resources.*.png /tmp/bold/misc

      - store_artifacts:
          path: /tmp/bold/misc

      - save_cache:
          key: bold-v6-{{ .Branch }}
          paths:
            - /tmp/bold/work

      - run:
          name: Run group-level on BOLD images
          no_output_timeout: 2h
          command: |
            docker run -u $( id -u ) --rm -ti -v /tmp/data/${TEST_DATA_NAME}:/data:ro \
                       -e MRIQC_DEV=1 \
                       -v $PWD:/scratch -w /scratch \
                       nipreps/mriqc:latest \
                       /data derivatives/ group \
                       -m bold -vv

      - store_artifacts:
          path: /tmp/bold/derivatives

      - run:
          name: Checking presence of outputs
          command: |
            mkdir -p /tmp/bold/test
            find /tmp/bold/derivatives | sed s+/tmp/bold/derivatives/++ | sort > /tmp/bold/test/outputs.out
            diff /tmp/src/mriqc/.circleci/circle_bold.txt /tmp/bold/test/outputs.out
            exit $?

      - run:
          name: Clean-up work directory (just leave reports & commandlines)
          command: |
            find /tmp/bold/work -type f -not -name "report.rst" -and -not -name "command.txt" -delete

      - store_artifacts:
          path: /tmp/bold/work

      - run:
          name: Checking changes on IQMs
          command: |
            docker run -u $( id -u ) --rm -ti -v /tmp/src:/src -v $PWD:/scratch -w /scratch \
              --entrypoint="dfcheck" nipreps/mriqc:latest \
              -i /scratch/derivatives/group_bold.tsv \
              -r /src/mriqc/mriqc/data/testdata/group_bold.tsv

      - run:
          name: WebAPI - Check records
          command: |
            docker run --rm -ti \
              --entrypoint="/opt/conda/bin/mriqcwebapi_test" \
              nipreps/mriqc:latest \
              bold 9 \
              --webapi-url http://$( hostname -I | awk '{print $1}' )/api/v1/bold

      - store_artifacts:
          path: /tmp/bold/test
    # The resource_class feature allows configuring CPU and RAM resources for each job. Different resource classes are available for different executors. https://circleci.com/docs/2.0/configuration-reference/#resourceclass
    resource_class: large

  build_docs:
    docker:
      - image: cimg/python:3.10
    environment:
      - FSLOUTPUTTYPE: NIFTI
    steps:
      - checkout
      - run:
          name: Install Graphviz
          command: sudo apt update && sudo apt -y install graphviz
      - run:
          name: Install deps
          command: |
            pip install -U pip hatch docutils
            hatch version
            pip install .[docs]
      - run:
          name: Build MRIQC documentation
          no_output_timeout: 2h
          command: |
            make -C docs SPHINXOPTS="-W" html | tee $PWD/builddocs.log
            cat $PWD/builddocs.log
            grep -qv "ERROR" $PWD/builddocs.log
      - store_artifacts:
          path: ./docs/_build/html

  test_package:
    docker:
      - image: cimg/python:3.9
    working_directory: /tmp/src/mriqc
    steps:
      - checkout
      - run:
          name: Start virtual environment
          command: |
            python -m venv /tmp/venv
            source /tmp/venv/bin/activate
            python -m pip install -U build hatch hatchling pip twine docutils
      - run:
          name: Build and check
          command: |
            source /tmp/venv/bin/activate
            python -m build -s -w
            python -m twine check dist/*
      - run:
          name: Validate version
          command: |
            source /tmp/venv/bin/activate
            THISVERSION=$( python3 -m hatch version | tail -n1 | xargs )
            python -m pip install dist/*.tar.gz
            mkdir empty
            cd empty
            INSTALLED=$( python -c 'import mriqc; print(mriqc.__version__)' )
            test "${CIRCLE_TAG:-$THISVERSION}" == "$INSTALLED"

  deploy_pypi:
    docker:
      - image: cimg/python:3.10
    working_directory: /tmp/src/mriqc
    steps:
      - checkout
      - run:
          name: Start virtual environment
          command: |
            python -m venv /tmp/venv
            source /tmp/venv/bin/activate
            python -m pip install -U hatch hatchling pip build twine docutils
      - run:
          name: Deploy to PyPi
          command: |
            source /tmp/venv/bin/activate

            # Set version on stone before editing the bundle
            export SETUPTOOLS_SCM_PRETEND_VERSION=$( python -m hatch version | tail -n1 | xargs )

            # Inject MRIQC-WebAPI secret
            if [ "${MRIQC_API_SECRET_TOKEN}" != "" ]; then
              sed -i -E "s/<secret_token>/$MRIQC_API_SECRET_TOKEN/" mriqc/config.py
              grep -q -i $MRIQC_API_SECRET_TOKEN mriqc/config.py
            fi
            python -m build -s -w
            python -m twine check dist/*
            python -m twine upload dist/*

  deploy_docker:
    machine:
      image: default
    working_directory: /tmp/src/mriqc
    steps:
      - restore_cache:
          keys:
            - build-v4-{{ .Branch }}-{{ .Revision }}
          paths:
            - /tmp/docker
            - /tmp/images
      - docker/install-docker-credential-helper
      - run:
          name: Docker authentication
          command: |
            if [[ -n $DOCKER_PAT ]]; then
              echo "$DOCKER_PAT" | docker login -u $DOCKER_USER --password-stdin
            fi
      - run:
          name: Set-up a Docker registry
          command: |
            if [[ -f /tmp/images/registry.tar.gz ]]; then
              echo "Loading saved registry image"
              docker load < /tmp/images/registry.tar.gz
            else
              echo "Pulling registry image from DockerHub"
              docker pull registry:2
            fi
            docker run -d -p 5000:5000 --restart=always --name=registry \
                -v /tmp/docker:/var/lib/registry registry:2
      - run:
          name: Pull images from local registry
          command: |
            docker pull localhost:5000/mriqc
            docker tag localhost:5000/mriqc nipreps/mriqc:latest

      - run:
          name: Deploy to Docker Hub
          no_output_timeout: 40m
          command: |
            # only tag & push latest if CIRCLE_TAG is set
            if [ -n "${CIRCLE_TAG:-}" ]; then
              docker push nipreps/mriqc:latest
            fi

            docker tag nipreps/mriqc nipreps/mriqc:"${CIRCLE_TAG:=experimental}"
            docker push nipreps/mriqc:"$CIRCLE_TAG"
            echo "Pushed tag ${CIRCLE_TAG} to Docker Hub"

workflows:
  version: 2
  build_test_deploy:
    jobs:
      - build_docs:
          filters:
            tags:
              only: /.*/

      - build:
          context:
            - nipreps-common
          filters:
            branches:
              ignore: /docs?\/.*/
            tags:
              only: /.*/

      - get_data:
          filters:
            branches:
              ignore: /docs?\/.*/
            tags:
              only: /.*/

      - test_package:
          context:
            - nipreps-common
          filters:
            branches:
              ignore: /docs?\/.*/
            tags:
              only: /.*/

      - test_pytest:
          context:
            - nipreps-common
          requires:
            - build
          filters:
            branches:
              ignore: /docs?\/.*/
            tags:
              only: /.*/

      - T1w:
          requires:
            - get_data
            - build
          filters:
            branches:
              ignore: /docs?\/.*/
            tags:
              only: /.*/

      - bold:
          requires:
            - get_data
            - build
          filters:
            branches:
              ignore: /docs?\/.*/
            tags:
              only: /.*/

      - deploy_docker:
          context:
            - nipreps-common
          requires:
            - build
            - test_pytest
            - test_package
            - build_docs
            - T1w
            - bold
          filters:
            branches:
              only:
                - master
            tags:
              only: /.*/

      - deploy_pypi:
          context:
            - nipreps-common
          requires:
            - deploy_docker
          filters:
            branches:
              ignore: /.*/
            tags:
              only: /.*/


================================================
FILE: .codecov.yml
================================================
codecov:
  token: 507d37e9-5aac-4c1e-b28c-f2b4ef9d2edf
  branch: master
  bot: oesteban

coverage:
  precision: 2
  round: down
  range: "70...100"

  status:
    project:
      default:
        target: auto
        threshold: 5.0
        branches:
          - master

    patch:
      default:
        target: auto
        branches:
          - master

    changes:
      default:
        branches:
          - master

  ignore:
    - build/.*
    - agave/.*
    - .*/data/.*

comment:
  layout: "header, diff, changes, sunburst, uncovered"
  branches:
    - master
  behavior: default


================================================
FILE: .dockerignore
================================================
# python cache
.cache/
__pycache__/**/*
__pycache__
*.pyc

# python distribution
build/**/*
build
dist/**/*
dist
mriqc.egg-info/**/*
mriqc.egg-info
.eggs/**/*
.eggs
src/**/*
src/
notebooks/
.maint/
.maint/**/*

# releasing
Makefile

###
### git MUST NOT be ignored after moving to multi-staged builds
###
### with the multi-staged build, the strategy is to create a wheel
### in a stage image. To create such a wheel, the git repo is necessary
### for hatch-vcs to interpolate the version and initialize _version.py
###
# .github/
# .gitignore
# .gitattributes
# .git/**/*
# .git

# Maintenance
.circleci/
.maint/
.codecov.yml
.coveragerc
.pep8speaks.yml
.pylintrc
.readthedocs.yaml
.travis.yml
.zenodo.json
CONTRIBUTING.md
codecov.yml
docs
docs/**/*
long_description.rst
notebooks
notebooks/**/*
requirements-dev.txt
requirements.txt
venv/
venv/**/*


================================================
FILE: .git_archival.txt
================================================
node: $Format:%H$
node-date: $Format:%cI$
describe-name: $Format:%(describe:tags=true,match=*[0-9]*)$
ref-names: $Format:%D$


================================================
FILE: .gitattributes
================================================
.git_archival.txt  export-subst


================================================
FILE: .github/config.yml
================================================
# Comment to be posted to on pull requests merged by a first time user
firstPRMergeComment: >
  Thanks for opening this pull request and congratulations for taking it to the finish line!
  It looks like this is your first time contributing to *MRIQC*. :smile:
  
  We invite you to list yourself as an *MRIQC* contributor.
  To learn more about what that entails and how we credit our contributors,
  please check out the
  [contributing guidelines](https://www.nipreps.org/community/CONTRIBUTING/#recognizing-contributions).
  If your name is not already on the list, please insert it, in alphabetical order of (i) lastname and
  (ii) firstname, into the
  [``.maint/CONTRIBUTORS.md`` file](https://github.com/nipreps/mriqc/blob/master/.maint/CONTRIBUTORS.md).

  Of course, if you want to opt-out this time, there is no
  problem at all with adding your name later.
  You will be always welcome to add it in the future whenever
  you feel it should be listed.


================================================
FILE: .github/dependabot.yml
================================================
---
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"


================================================
FILE: .github/workflows/pythonpackage.yml
================================================
# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions

name: Python package

on:
  push:
    branches: [ '*' ]
    tags: [ '*' ]
  pull_request:
    branches: [ master, 'maint/*' ]

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  build:
    if: "!startsWith(github.ref, 'refs/tags/') && !contains(github.event.head_commit.message, '[skip ci]')"
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ['3.9', '3.10', '3.11', '3.12', '3.13']

    steps:
    - uses: actions/checkout@v6
      with:
        fetch-depth: 0
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v6
      with:
        python-version: ${{ matrix.python-version }}
    - name: Build and check package
      run: |
        pipx run build
        pipx run twine check dist/mriqc-*
    - name: Interpolate version
      run: |
        # Interpolate version
        if [[ "$GITHUB_REF" == refs/tags/* ]]; then
          TAG=${GITHUB_REF##*/}
        fi
        THISVERSION=$( pipx run hatch version | tail -n1 | xargs )
        THISVERSION=${TAG:-$THISVERSION}
        echo "Expected VERSION: \"${THISVERSION}\""
        echo "THISVERSION=${THISVERSION}" >> $GITHUB_ENV
    - name: Install in confined environment [pip]
      run: |
        python -m venv /tmp/pip
        source /tmp/pip/bin/activate
        python -m pip install .
        INSTALLED_VERSION=$(python -c 'import mriqc as qc; print(qc.__version__, end="")')
        echo "INSTALLED: \"${INSTALLED_VERSION}\""
        test "${INSTALLED_VERSION}" = "${THISVERSION}"
        rm -r /tmp/pip
    - name: Install in confined environment [sdist]
      run: |
        python -m venv /tmp/install_sdist
        source /tmp/install_sdist/bin/activate
        python -m pip install dist/mriqc*.tar.gz
        INSTALLED_VERSION=$(python -c 'import mriqc as qc; print(qc.__version__, end="")')
        echo "INSTALLED: \"${INSTALLED_VERSION}\""
        test "${INSTALLED_VERSION}" = "${THISVERSION}"
        rm -r /tmp/install_sdist
    - name: Install in confined environment [wheel]
      run: |
        python -m venv /tmp/install_wheel
        source /tmp/install_wheel/bin/activate
        python -m pip install dist/mriqc*.whl
        INSTALLED_VERSION=$(python -c 'import mriqc as qc; print(qc.__version__, end="")')
        echo "INSTALLED: \"${INSTALLED_VERSION}\""
        test "${INSTALLED_VERSION}" = "${THISVERSION}"
        rm -r /tmp/install_wheel

  ruff:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v6
    - run: |
        pipx run ruff check --output-format=github
        pipx run ruff format --diff

  codespell:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v6
    - uses: codespell-project/actions-codespell@v2


================================================
FILE: .gitignore
================================================
# setuptools-scm
mriqc/_version.py

.DS_Store

# IDE configuration
.idea/
.vscode

# Documentation build
docs/build
build/

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]

# C extensions
*.so

# Distribution / packaging
.Python
env/
venv/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover

# Translations
*.mo
*.pot

# Django stuff
*.log

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Run files
work/

================================================
FILE: .mailmap
================================================
Aaron Piccirilli <apiccirilli@gmail.com>
Adam Huffman <bloch@verdurin.com>
Adam Huffman <bloch@verdurin.com> verdurin
Adam C. Raikes <adam.raikes@gmail.com>
Adam C. Raikes <adam.raikes@gmail.com> araikes
Adam C. Raikes <adam.raikes@gmail.com> Adam Raikes
Ariel Rokem <arokem@gmail.com>
Asier Erramuzpe <asier.erramuzpe@gmail.com>
Asier Erramuzpe <asier.erramuzpe@gmail.com> erramuzpe
Bennet Fauber <justbennet@users.noreply.github.com>
Bennet Fauber <justbennet@users.noreply.github.com> justbennet
Céline Provins <celine.provins@unil.ch>
Céline Provins <celine.provins@unil.ch> cprovins
Céline Provins <celine.provins@unil.ch> celprov
Céline Provins <celine.provins@unil.ch> <77437752+celprov@users.noreply.github.com>
Christopher J. Markiewicz <effigies@gmail.com>
Christopher J. Markiewicz <effigies@gmail.com> <effigies@bu.edu>
Christopher J. Markiewicz <effigies@gmail.com> <markiewicz@stanford.edu>
Conrad Ma <Conrad@Conrads-MacBook-Pro.local>
Conrad Ma <Conrad@Conrads-MacBook-Pro.local> Conrad 
Conrad Ma <Conrad@Conrads-MacBook-Pro.local> 394822740 
Conrad Ma <Conrad@Conrads-MacBook-Pro.local> <394822740@qq.com>
Conrad Ma <Conrad@Conrads-MacBook-Pro.local> <maconrad49@gmail.com>
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com>
Dylan Nielson <adenosine@gmail.com>
Dylan Nielson <adenosine@gmail.com> Dylan <Dylan.Nielson@nih.gov>
Elodie Savary <elodie.savary@outlook.com>
Elodie Savary <elodie.savary@outlook.com> esavary
James D. Kent <james-kent@uiowa.edu>
James D. Kent <james-kent@uiowa.edu> <jamesdkent21@gmail.com>
James D. Kent <james-kent@uiowa.edu> jdkent
James D. Kent <james-kent@uiowa.edu> Fred Mertz <mertzf@bargle.argle>
Johannes Achtzehn <johannes.achtzehn@gmail.com>
Johannes Achtzehn <johannes.achtzehn@gmail.com> jAchtzehn
John A. Lee <johnleenimh@gmail.com>
John A. Lee <johnleenimh@gmail.com> john anthony lee
John A. Lee <johnleenimh@gmail.com> leej3
Krzysztof J. Gorgolewski <krzysztof.gorgolewski@gmail.com>
Krzysztof J. Gorgolewski <krzysztof.gorgolewski@gmail.com> <chris.gorgolewski@gmail.com>
Krzysztof J. Gorgolewski <krzysztof.gorgolewski@gmail.com> <filo@filo-dtc-laptop>
Krzysztof J. Gorgolewski <krzysztof.gorgolewski@gmail.com> <filo@filo-Precision-M6500.(none)>
Krzysztof J. Gorgolewski <krzysztof.gorgolewski@gmail.com> <filo@filo-Precision-M6500>
Krzysztof J. Gorgolewski <krzysztof.gorgolewski@gmail.com> <filo@filolaptop>
Krzysztof J. Gorgolewski <krzysztof.gorgolewski@gmail.com> <krzysztof.gorgolewski+fake@gmail.com>
Mathias Goncalves <goncalves.mathias@gmail.com>
Mathias Goncalves <goncalves.mathias@gmail.com> mathiasg
Mathias Goncalves <goncalves.mathias@gmail.com> <mathiasg@mit.edu>
Mathias Goncalves <goncalves.mathias@gmail.com> <mathiasg@stanford.edu>
McKenzie P. Hagen <mphagen@uw.edu>
McKenzie P. Hagen <mphagen@uw.edu> mckenziephagen
Michael Dayan <michael.dayan@fcbg.ch>
Michael G. Clark <michael.clark3@nih.gov>
Michael G. Clark <michael.clark3@nih.gov> mgclark
Michael G. Clark <michael.clark3@nih.gov> Michael Clark
Michael Krause <krause@mpib-berlin.mpg.de>
Michael Krause <krause@mpib-berlin.mpg.de> octomike
NiPreps Bot <nipreps@gmail.com>
NiPreps Bot <nipreps@gmail.com> nipreps-bot
Pablo Velasco <pablo.velasco@nyu.edu>
Pablo Velasco <pablo.velasco@nyu.edu> pvelasco
Patrick Sadil <psadil@gmail.com>
Patrick Sadil <psadil@gmail.com> psadil
Oscar Esteban <code@oscaresteban.es>
Oscar Esteban <code@oscaresteban.es> <oesteban@stanford.edu>
Ross Blair <rblair2@stanford.edu>
Ross Blair <rblair2@stanford.edu> <rosswilsonblair@gmail.com>
Teresa Gomez <46339554+teresamg@users.noreply.github.com>
Teresa Gomez <46339554+teresamg@users.noreply.github.com> teresamg
Yibei Chen <yibeichan@gmail.com>
Victor Férat <victor.ferat@live.Fr>
Victor Férat <victor.ferat@live.Fr> vferat
William Triplett <wtriplet@stanford.edu>
Zvi Baratz <z.baratz@gmail.com>
Zvi Baratz <z.baratz@gmail.com> ZviBaratz
Zvi Baratz <z.baratz@gmail.com> zvi-quantivly
Zvi Baratz <z.baratz@gmail.com> <133042121+zvi-quantivly@users.noreply.github.com>
Zvi Baratz <z.baratz@gmail.com> <zvi.baratz@quantivly.com>


================================================
FILE: .maint/CONTRIBUTORS.md
================================================
# CONTRIBUTORS

This document lists those who have made contributions to the Project.
As per the contributor guidelines, they should be included by default in any publications derived from the Project.

If you are new to the project, don't forget to add your name and affiliation to the list of contributors here! Our Welcome Bot will send an automated message reminding this to first-time contributors.
Before every release, unlisted contributors will be invited again to add their names to this file (just in case they missed the automated message from our Welcome Bot).

| **Lastname** | **Name** | **Handle** | **ORCID** | **Affiliation** |
| --- | --- | --- | --- | --- |
| Achtzehn | Johannes | @jAchtzehn | 0000-0002-0657-6516 | Charité Berlin, Berlin, Germany |
| Baratz | Zvi | @zvi-quantivly | 0000-0001-7159-1387 | Quantivly Inc., Somerville, MA, USA |
| Beliy | Nikita | @nbeliy | | CRC ULiege, Liege, Belgium |
| Birman | Daniel | @dbirman | 0000-0003-3748-6289 | Department of Psychology, Stanford University, CA, USA |
| Blair | Ross W. | @rwblair | 0000-0003-3007-1056 | Department of Psychology, Stanford University, CA, USA |
| Chen | Yibei | @yibeichan | 0000-0003-2882-0900 | McGovern Institute for Brain Research, Massachusetts Institute of Technology, Cambridge, USA |
| Clark | Michael G. | @mgclark | | National Institutes of Health, USA |
| Dayan | Michael | @neurorepro | 0000-0002-2666-0969 | International Committee of the Red Cross - ICRC, Geneva, Switzerland |
| Durnez | Joke | @jokedurnez | 0000-0001-9030-2202 | Department of Psychology, Stanford University, CA, USA |
| Erramuzpe | Asier | @erramuzpe | 0000-0002-9402-2184 | Computational Neuroimaging Lab, BioCruces Health Research Institute |
| Fauber | Bennet | @justbennet | | University of Michigan, Ann Arbor, USA |
| Férat | Victor | @vferat | 0000-0003-1952-7657 | Department of Basic Neurosciences, Université de Genève, Geneva, Switzerland |
| Garcia-Dias | Rafael | @garciadias | 0000-0001-9332-1580 | Institute of Psychiatry, Psychology & Neuroscience, King's College London, London, UK |
| Ghosh | Satrajit S. | @satra | 0000-0002-5312-6729 | McGovern Institute for Brain Research, MIT, MA, USA; and Department of Otolaryngology, Harvard Medical School, MA, USA |
| Gomez | Teresa | @teresamg | | The University of Washington eScience Institute, WA, USA |
| Goncalves | Mathias | @mgxd | 0000-0002-7252-7771 | Department of Psychology, Stanford University, CA, USA |
| Halchenko | Yaroslav O. | @yarikoptic | 0000-0003-3456-2493 | Psychological and Brain Sciences Department, Dartmouth College, NH, USA |
| Huffman | Adam | @verdurin | | Department of Physics, Imperial College London, London, UK |
| Kay | Benjamin | @benkay86 | | Washington University School of Medicine, St.Louis, MO, USA |
| Kent | James D. | @jdkent | 0000-0002-4892-2659 | Department of Psychology, University of Texas at Austin, TX, USA |
| Krause | Michael | @octomike | | Max Planck Institute for Human Development, Berlin, Germany |
| Lee | John A. | @leej3 | 0000-0001-5884-4247 | Quansight, Dublin, Ireland |
| Legarreta Gorroño | Jon Haitz | @jhlegarreta | 0000-0002-9661-1396 | Brigham and Women's Hospital, Mass General Brigham, Harvard Medical School, MA, USA |
| Nichols | Thomas | @nicholst | 0000-0002-4516-5103 | Oxford Big Data Institute, University of Oxford, Oxford, GB |
| Nielson | Dylan | @Shotgunosine | 0000-0003-4613-6643 | Section on Clinical and Computational Psychiatry, National Institute of Mental Health, Bethesda, MD, USA |
| Papadopoulos Orfanos | Dimitri | @DimitriPapadopoulos | 0000-0002-1242-8990 | NeuroSpin, CEA, Université Paris-Saclay, NeuroSpin, Gif-sur-Yvette, France |
| Raikes | Adam C. | @araikes | | Center for Innovation in Brain Science, University of Arizona, Tucson, AZ, USA |
| Rokem | Ariel | @arokem | 0000-0003-0679-1985 | The University of Washington eScience Institute, WA, USA |
| Sadil | Patrick | @psadil | 0000-0003-4141-1343 | Johns Hopkins Bloomberg School of Public Health, MD, USA |
| Salo | Taylor | @tsalo | 0000-0001-9813-3167 | Department of Psychology, Florida International University, FL, USA |
| Savary | Elodie | @esavary | 0000-0002-3896-6906 | Department of Radiology, Lausanne University Hospital and University of Lausanne, Switzerland |
| Tooley | Ursula A. | @utooley | 0000-0001-6377-3885 | Department of Neuroscience, University of Pennsylvania, PA, USA |
| Triplett | William | @wtriplett | 0000-0002-9546-1306 | University of Florida: Gainesville, Florida, US |
| Varada | Jan | @jvarada | | Functional MRI Facility, National Institute of Mental Health, Bethesda, MD, USA |
| Velasco | Pablo | @pvelasco | 0000-0002-5749-6049 | Center for Brain Imaging, New York University, NY, USA |


================================================
FILE: .maint/FORMER.md
================================================
# FORMER MEMBERS

This document lists former contributors or maintainers who want to disengage from the Project, and seek to be dismissed in communications or future papers.
By adding your name to this list you are giving up on all your responsibilities to the project.
Should you desire to be considered back as a contributor or maintainer, please remove your name from this list and proceed as prescribed in the governance documents.

| **Lastname** | **Name** | **Handle** |
| --- | --- | --- |
| Bot | NiPreps | @nipreps-bot |
| dependabot[bot] | | @dependabot |
| Ma | Conrad | @394822740 |
| Piccirilli | Aaron | @apiccirilli |
| Gorgolewski | Krzysztof J. | @chrisgorgo |


================================================
FILE: .maint/MAINTAINERS.md
================================================
# Maintainers

This document lists the Maintainers of the project.
Maintainers may be added once approved by the existing maintainers as described in the `../GOVERNANCE.md` document.
By adding your name to this list you are agreeing to abide by the governance documents and to abide by all of the Organization's polices, including the code of conduct, trademark policy, and antitrust policy.
If you are participating because of your affiliation with another organization (designated below), you represent that you have the authority to bind that organization to these policies.

<!-- EXAMPLE: The current contents of the table are given for an example, please update. -->

| **Lastname** | **Name** | **Handle** | **ORCID** | **Affiliation** |
| --- | --- | --- | --- | --- |
| Provins | Céline | @celprov | 0000-0002-1668-9629 | Department of Radiology, Lausanne University Hospital and University of Lausanne, Switzerland |
| Hagen | McKenzie P. | @mckenziephagen | 0000-0002-7454-8189 | Psychology Department, University of Washington, Seattle, WA, USA |
| MacNicol | Eilidh | @eilidhmacnicol | 0000-0003-3715-7012 | Department of Neuroimaging, Institute of Psychiatry, Psychology and Neuroscience, King's College London, London, UK |
| Esteban | Oscar | @oesteban | 0000-0001-8435-6191 | Lausanne University Hospital and University of Lausanne, Lausanne, Switzerland |
| Markiewicz | Christopher J. | @effigies | 0000-0002-6533-164X | Department of Psychology, Stanford University, CA, USA |


================================================
FILE: .maint/PIs.md
================================================
# PRINCIPAL INVESTIGATORS

This documents the key personnel who oversees the development of the Project and secures funding.
The names in this file are designated by the Organization's TSC at the time of accepting the Project under the Organization.
Changes to this file must be approved by the TSC.
When a PI ceases serving as such, by default, their name will be placed in the `CONTRIBUTORS.md` file should it not be there already.

By having your name in this list you are agreeing to abide by the governance documents and to abide by all of the Organization's polices, including the code of conduct, trademark policy, and antitrust policy.
If you are participating because of your affiliation with another organization (designated below), you represent that you have the authority to bind that organization to these policies.

| **Lastname** | **Name** | **Handle** | **ORCID** | **Affiliation** |
| --- | --- | --- | --- | --- |
| Esteban | Oscar | @oesteban | 0000-0001-8435-6191 | Department of Radiology, Lausanne University Hospital and University of Lausanne, Switzerland |
| Rokem | Ariel | @arokem | 0000-0003-0679-1985 | The University of Washington eScience Institute, WA, USA |
| Poldrack | Russell A. | @poldrack | 0000-0001-6755-0259 | Department of Psychology, Stanford University, CA, USA |
| Thomas | Adam G. | | 0000-0002-2850-1419 | Data Science and Sharing Team, National Institute of Mental Health, Bethesda, MD, USA |


================================================
FILE: .maint/ROADMAP.md
================================================
# ROADMAP

This document states how the roadmap is built, discussed and monitored by the Maintainers, with the engagement of Contributors and PIs.

For example, if the GitHub Projects feature is used, this document will contain a link to the corresponding Project and document who is responsible of managing the project, contacting Contributors and Maintainers to monitor the progress of activities, organizing meetings and discussions around the activities, etc.

This document may also indicate how the *milestones* feature of the project is used and, as for Projects, who is responsible of what coordination actions, their frequence, etc.


================================================
FILE: .maint/requirements.txt
================================================
click
fuzzywuzzy
python-Levenshtein

================================================
FILE: .maint/update_authors.py
================================================
#!/usr/bin/env python3
"""Update and sort the creators list of the zenodo record."""
import json
import sys
from pathlib import Path

import click
from fuzzywuzzy import fuzz, process


def read_md_table(md_text):
    """
    Extract the first table found in a markdown document as a Python dict.

    Examples
    --------
    >>> read_md_table('''
    ... # Some text
    ...
    ... More text
    ...
    ... | **Header1** | **Header2** |
    ... | --- | --- |
    ... | val1 | val2 |
    ... |  | val4 |
    ...
    ... | **Header3** | **Header4** |
    ... | --- | --- |
    ... | val1 | val2 |
    ... |  | val4 |
    ... ''')
    [{'header1': 'val1', 'header2': 'val2'}, {'header2': 'val4'}]

    """
    prev = None
    keys = None
    retval = []
    for line in md_text.splitlines():
        if line.strip().startswith('| --- |'):
            keys = (
                k.replace('*', '').strip()
                for k in prev.split('|')
            )
            keys = [k.lower() for k in keys if k]
            continue
        elif not keys:
            prev = line
            continue

        if not line or not line.strip().startswith('|'):
            break

        values = [v.strip() or None for v in line.split('|')][1:-1]
        retval.append({k: v for k, v in zip(keys, values) if v})

    return retval


def sort_contributors(entries, git_lines, exclude=None, last=None):
    """Return a list of author dictionaries, ordered by contribution."""
    last = last or []
    sorted_authors = sorted(entries, key=lambda i: i['name'])

    first_last = [
        ' '.join(val['name'].split(',')[::-1]).strip() for val in sorted_authors
    ]
    first_last_excl = [
        ' '.join(val['name'].split(',')[::-1]).strip() for val in exclude or []
    ]

    unmatched = []
    author_matches = []
    for ele in git_lines:
        matches = process.extract(
            ele, first_last, scorer=fuzz.token_sort_ratio, limit=2
        )
        # matches is a list [('First match', % Match), ('Second match', % Match)]
        if matches[0][1] > 80:
            val = sorted_authors[first_last.index(matches[0][0])]
        else:
            # skip unmatched names
            if ele not in first_last_excl:
                unmatched.append(ele)
            continue

        if val not in author_matches:
            author_matches.append(val)

    names = {' '.join(val['name'].split(',')[::-1]).strip() for val in author_matches}
    for missing_name in first_last:
        if missing_name not in names:
            missing = sorted_authors[first_last.index(missing_name)]
            author_matches.append(missing)

    position_matches = []
    for i, item in enumerate(author_matches):
        pos = item.pop('position', None)
        if pos is not None:
            position_matches.append((i, int(pos)))

    for i, pos in position_matches:
        if pos < 0:
            pos += len(author_matches) + 1
        author_matches.insert(pos, author_matches.pop(i))

    return author_matches, unmatched


def get_git_lines(fname='line-contributors.txt'):
    """Run git-line-summary."""
    import shutil
    import subprocess as sp

    contrib_file = Path(fname)

    lines = []
    if contrib_file.exists():
        print('WARNING: Reusing existing line-contributors.txt file.', file=sys.stderr)
        lines = contrib_file.read_text().splitlines()

    git_line_summary_path = shutil.which('git-line-summary')
    if not git_line_summary_path:
        git_line_summary_path = 'git summary --dedup-by-email'.split(' ')
    else:
        git_line_summary_path = [git_line_summary_path]

    if not lines and git_line_summary_path:
        print('Running git-line-summary on repo')
        lines = sp.check_output(git_line_summary_path).decode().splitlines()
        lines = [line for line in lines if 'Not Committed Yet' not in line]
        contrib_file.write_text('\n'.join(lines))

    if not lines:
        _msg = (
            ': git-line-summary not found, please install git-extras '
            * (git_line_summary_path is None)
        )
        raise RuntimeError(
            f'Could not find line-contributors from git repository{_msg}.'
        )
    return [' '.join(line.strip().split()[1:-1]) for line in lines if '%' in line]


def _namelast(inlist):
    retval = []
    for i in inlist:
        i['name'] = (f"{i.pop('name', '')} {i.pop('lastname', '')}").strip()
        if not i['name']:
            i['name'] = i.get('handle', '<Unknown Name>')
        retval.append(i)
    return retval


@click.group()
def cli():
    """Generate authorship boilerplates."""
    pass


@cli.command()
@click.option('-z', '--zenodo-file', type=click.Path(exists=True), default='.zenodo.json')
@click.option('-m', '--maintainers', type=click.Path(exists=True), default='.maint/MAINTAINERS.md')
@click.option('-c', '--contributors', type=click.Path(exists=True),
              default='.maint/CONTRIBUTORS.md')
@click.option('--pi', type=click.Path(exists=True), default='.maint/PIs.md')
@click.option('-f', '--former-file', type=click.Path(exists=True), default='.maint/FORMER.md')
def zenodo(
    zenodo_file,
    maintainers,
    contributors,
    pi,
    former_file,
):
    """Generate a new Zenodo payload file."""
    data = get_git_lines()

    zenodo = json.loads(Path(zenodo_file).read_text())

    former = _namelast(read_md_table(Path(former_file).read_text()))
    zen_creators, miss_creators = sort_contributors(
        _namelast(read_md_table(Path(maintainers).read_text())),
        data,
        exclude=former,
    )

    zen_contributors, miss_contributors = sort_contributors(
        _namelast(read_md_table(Path(contributors).read_text())),
        data,
        exclude=former
    )

    zen_pi = _namelast(reversed(read_md_table(Path(pi).read_text())))

    zenodo['creators'] = zen_creators
    zenodo['contributors'] = zen_contributors + [
        pi for pi in zen_pi if pi not in zen_contributors
    ]
    creator_names = {
        c['name'] for c in zenodo['creators']
        if c['name'] != '<Unknown Name>'
    }

    zenodo['contributors'] = [
        c for c in zenodo['contributors']
        if c['name'] not in creator_names
    ]

    misses = set(miss_creators).intersection(miss_contributors)
    if misses:
        print(
            "Some people made commits, but are missing in .maint/ "
            f"files: {', '.join(misses)}",
            file=sys.stderr,
        )

    # Remove position
    for creator in zenodo['creators']:
        creator.pop('position', None)
        creator.pop('handle', None)
        if 'affiliation' not in creator:
            creator['affiliation'] = 'Unknown affiliation'
        elif isinstance(creator['affiliation'], list):
            creator['affiliation'] = creator['affiliation'][0]

    for creator in zenodo['contributors']:
        creator.pop('handle', None)
        creator['type'] = 'Researcher'
        creator.pop('position', None)

        if 'affiliation' not in creator:
            creator['affiliation'] = 'Unknown affiliation'
        elif isinstance(creator['affiliation'], list):
            creator['affiliation'] = creator['affiliation'][0]

    Path(zenodo_file).write_text(
        f'{json.dumps(zenodo, indent=2)}\n'
    )


@cli.command()
@click.option('-m', '--maintainers', type=click.Path(exists=True), default='.maint/MAINTAINERS.md')
@click.option('-c', '--contributors', type=click.Path(exists=True),
              default='.maint/CONTRIBUTORS.md')
@click.option('--pi', type=click.Path(exists=True), default='.maint/PIs.md')
@click.option('-f', '--former-file', type=click.Path(exists=True), default='.maint/FORMER.md')
def publication(
    maintainers,
    contributors,
    pi,
    former_file,
):
    """Generate the list of authors and affiliations for papers."""
    members = (
        _namelast(read_md_table(Path(maintainers).read_text()))
        + _namelast(read_md_table(Path(contributors).read_text()))
    )
    former_names = _namelast(read_md_table(Path(former_file).read_text()))

    hits, misses = sort_contributors(
        members,
        get_git_lines(),
        exclude=former_names,
    )

    pi_hits = _namelast(reversed(read_md_table(Path(pi).read_text())))
    pi_names = [pi['name'] for pi in pi_hits]
    hits = [
        hit for hit in hits
        if hit['name'] not in pi_names
    ] + pi_hits

    def _aslist(value):
        if isinstance(value, (list, tuple)):
            return value
        return [value]

    # Remove position
    affiliations = []
    for item in hits:
        item.pop('position', None)
        for a in _aslist(item.get('affiliation', 'Unaffiliated')):
            if a not in affiliations:
                affiliations.append(a)

    aff_indexes = [
        ', '.join(
            [
                '%d' % (affiliations.index(a) + 1)
                for a in _aslist(author.get('affiliation', 'Unaffiliated'))
            ]
        )
        for author in hits
    ]

    if misses:
        print(
            "Some people made commits, but are missing in .maint/ "
            f"files: {', '.join(misses)}",
            file=sys.stderr,
        )

    print('Authors (%d):' % len(hits))
    print(
        '{}.'.format('; '.join(
            [
                '{} \\ :sup:`{}`\\ '.format(i['name'], idx)
                for i, idx in zip(hits, aff_indexes)
            ]
        ))
    )

    print(
        '\n\nAffiliations:\n{}'.format('\n'.join(
            [f'{i + 1: >2}. {a}' for i, a in enumerate(affiliations)]
        ))
    )


if __name__ == '__main__':
    """ Install entry-point """
    cli()


================================================
FILE: .maint/update_changes.sh
================================================
#!/bin/bash
#
# Collects the pull-requests since the latest release and
# aranges them in the CHANGES.rst file.
#
# This is a script to be run before releasing a new version.
#
# Usage /bin/bash update_changes.sh 1.0.1
#

# Setting      # $ help set
set -u         # Treat unset variables as an error when substituting.
set -x         # Print command traces before executing command.

# Check whether the Upcoming release header is present
head -1 CHANGES.rst | grep -q Upcoming
UPCOMING=$?
if [[ "$UPCOMING" == "0" ]]; then
    head -n3  CHANGES.rst >> newchanges
fi

# Search for PRs since previous release
git show --pretty='format:  * %b %s'  HEAD | sed 's/Merge pull request \#\([^\d]*\)\ from\ .*/(\#\1)/' >> newchanges

# Add back the Upcoming header if it was present
if [[ "$UPCOMING" == "0" ]]; then
    tail -n+4 CHANGES.rst >> newchanges
else
    cat CHANGES.rst >> newchanges
fi

# Replace old CHANGES.rst with new file
mv newchanges CHANGES.rst



================================================
FILE: .readthedocs.yaml
================================================
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details

# Required
version: 2

# Set the version of Python and other tools you might need
build:
  os: ubuntu-20.04
  apt_packages:
    - graphviz
  tools:
    python: "3.9"

# Build documentation in the docs/ directory with Sphinx
sphinx:
   configuration: docs/source/conf.py

# Install with pip install .[docs]
python:
  install:
    - method: pip
      path: .
      extra_requirements:
        - docs


================================================
FILE: .zenodo.json
================================================
{
  "title": "MRIQC: Advancing the automatic prediction of image quality in MRI from unseen sites",
  "description": "<p>Automated Quality Control and visual reports for Quality Assessment of structural (T1w, T2w) and functional MRI of the brain <a href=http://mriqc.readthedocs.io>http://mriqc.readthedocs.io</a>.</p>",
  "creators": [
    {
      "orcid": "0000-0001-8435-6191",
      "affiliation": "Lausanne University Hospital and University of Lausanne, Lausanne, Switzerland",
      "name": "Oscar Esteban"
    },
    {
      "orcid": "0000-0002-6533-164X",
      "affiliation": "Department of Psychology, Stanford University, CA, USA",
      "name": "Christopher J. Markiewicz"
    },
    {
      "orcid": "0000-0003-3715-7012",
      "affiliation": "Department of Neuroimaging, Institute of Psychiatry, Psychology and Neuroscience, King's College London, London, UK",
      "name": "Eilidh MacNicol"
    },
    {
      "orcid": "0000-0002-1668-9629",
      "affiliation": "Department of Radiology, Lausanne University Hospital and University of Lausanne, Switzerland",
      "name": "C\u00e9line Provins"
    },
    {
      "orcid": "0000-0002-7454-8189",
      "affiliation": "Psychology Department, University of Washington, Seattle, WA, USA",
      "name": "McKenzie P. Hagen"
    }
  ],
  "contributors": [
    {
      "orcid": "0000-0001-7159-1387",
      "affiliation": "Quantivly Inc., Somerville, MA, USA",
      "name": "Zvi Baratz",
      "type": "Researcher"
    },
    {
      "affiliation": "The University of Washington eScience Institute, WA, USA",
      "name": "Teresa Gomez",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0003-4613-6643",
      "affiliation": "Section on Clinical and Computational Psychiatry, National Institute of Mental Health, Bethesda, MD, USA",
      "name": "Dylan Nielson",
      "type": "Researcher"
    },
    {
      "affiliation": "Functional MRI Facility, National Institute of Mental Health, Bethesda, MD, USA",
      "name": "Jan Varada",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0003-3007-1056",
      "affiliation": "Department of Psychology, Stanford University, CA, USA",
      "name": "Ross W. Blair",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0003-0679-1985",
      "affiliation": "The University of Washington eScience Institute, WA, USA",
      "name": "Ariel Rokem",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0002-1242-8990",
      "affiliation": "NeuroSpin, CEA, Universit\u00e9 Paris-Saclay, NeuroSpin, Gif-sur-Yvette, France",
      "name": "Dimitri Papadopoulos Orfanos",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0002-9546-1306",
      "affiliation": "University of Florida: Gainesville, Florida, US",
      "name": "William Triplett",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0002-7252-7771",
      "affiliation": "Department of Psychology, Stanford University, CA, USA",
      "name": "Mathias Goncalves",
      "type": "Researcher"
    },
    {
      "affiliation": "CRC ULiege, Liege, Belgium",
      "name": "Nikita Beliy",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0001-5884-4247",
      "affiliation": "Quansight, Dublin, Ireland",
      "name": "John A. Lee",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0002-9661-1396",
      "affiliation": "Brigham and Women's Hospital, Mass General Brigham, Harvard Medical School, MA, USA",
      "name": "Jon Haitz Legarreta Gorro\u00f1o",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0003-4141-1343",
      "affiliation": "Johns Hopkins Bloomberg School of Public Health, MD, USA",
      "name": "Patrick Sadil",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0001-6377-3885",
      "affiliation": "Department of Neuroscience, University of Pennsylvania, PA, USA",
      "name": "Ursula A. Tooley",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0003-3456-2493",
      "affiliation": "Psychological and Brain Sciences Department, Dartmouth College, NH, USA",
      "name": "Yaroslav O. Halchenko",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0003-2882-0900",
      "affiliation": "McGovern Institute for Brain Research, Massachusetts Institute of Technology, Cambridge, USA",
      "name": "Yibei Chen",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0002-4892-2659",
      "affiliation": "Department of Psychology, University of Texas at Austin, TX, USA",
      "name": "James D. Kent",
      "type": "Researcher"
    },
    {
      "affiliation": "University of Michigan, Ann Arbor, USA",
      "name": "Bennet Fauber",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0001-9813-3167",
      "affiliation": "Department of Psychology, Florida International University, FL, USA",
      "name": "Taylor Salo",
      "type": "Researcher"
    },
    {
      "affiliation": "Max Planck Institute for Human Development, Berlin, Germany",
      "name": "Michael Krause",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0002-5749-6049",
      "affiliation": "Center for Brain Imaging, New York University, NY, USA",
      "name": "Pablo Velasco",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0002-4516-5103",
      "affiliation": "Oxford Big Data Institute, University of Oxford, Oxford, GB",
      "name": "Thomas Nichols",
      "type": "Researcher"
    },
    {
      "affiliation": "Department of Physics, Imperial College London, London, UK",
      "name": "Adam Huffman",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0002-3896-6906",
      "affiliation": "Department of Radiology, Lausanne University Hospital and University of Lausanne, Switzerland",
      "name": "Elodie Savary",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0002-0657-6516",
      "affiliation": "Charit\u00e9 Berlin, Berlin, Germany",
      "name": "Johannes Achtzehn",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0001-9030-2202",
      "affiliation": "Department of Psychology, Stanford University, CA, USA",
      "name": "Joke Durnez",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0002-5312-6729",
      "affiliation": "McGovern Institute for Brain Research, MIT, MA, USA; and Department of Otolaryngology, Harvard Medical School, MA, USA",
      "name": "Satrajit S. Ghosh",
      "type": "Researcher"
    },
    {
      "affiliation": "Center for Innovation in Brain Science, University of Arizona, Tucson, AZ, USA",
      "name": "Adam C. Raikes",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0002-9402-2184",
      "affiliation": "Computational Neuroimaging Lab, BioCruces Health Research Institute",
      "name": "Asier Erramuzpe",
      "type": "Researcher"
    },
    {
      "affiliation": "Washington University School of Medicine, St.Louis, MO, USA",
      "name": "Benjamin Kay",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0003-3748-6289",
      "affiliation": "Department of Psychology, Stanford University, CA, USA",
      "name": "Daniel Birman",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0002-2666-0969",
      "affiliation": "International Committee of the Red Cross - ICRC, Geneva, Switzerland",
      "name": "Michael Dayan",
      "type": "Researcher"
    },
    {
      "affiliation": "National Institutes of Health, USA",
      "name": "Michael G. Clark",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0001-9332-1580",
      "affiliation": "Institute of Psychiatry, Psychology & Neuroscience, King's College London, London, UK",
      "name": "Rafael Garcia-Dias",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0002-2850-1419",
      "affiliation": "Data Science and Sharing Team, National Institute of Mental Health, Bethesda, MD, USA",
      "name": "Adam G. Thomas",
      "type": "Researcher"
    },
    {
      "orcid": "0000-0001-6755-0259",
      "affiliation": "Department of Psychology, Stanford University, CA, USA",
      "name": "Russell A. Poldrack",
      "type": "Researcher"
    }
  ],
  "keywords": [
    "neuroimaging",
    "workflow",
    "pipeline",
    "quality-control",
    "fMRI",
    "BIDS"
  ],
  "related_identifiers": [
    {
      "identifier": "http://mriqc.readthedocs.io",
      "relation": "documents",
      "scheme": "url"
    },
    {
      "identifier": "10.1371/journal.pone.0184661",
      "relation": "isPartOf",
      "scheme": "doi"
    }
  ],
  "license": "Apache-2.0",
  "upload_type": "software"
}


================================================
FILE: AGENTS.md
================================================
# Agent Instructions for Codex

## Operating Principles
1. **Always plan first.** Provide a brief plan before any changes and do the hardest thinking during the planning phase.
2. **Highlight critical points.** When proposing tasks, call out steps that could introduce side effects (e.g., migrations, API changes, backward-compatibility concerns).
3. **Ask one question at a time.** If a decision is needed from a user, ask a single, clear question before proceeding.

## Branch Naming
- **Format:** `<type>/<short-description>`
- **Examples:**
  - `fix/one-off-bug-gh134`
  - `enh/add-bids-validator`
  - `doc/update-readme`
- If working from a tracked issue, include the issue number in the branch name (e.g., `fix/segfault-gh134`).

## Commit Messages (Conventional Commits)
- **Must strictly follow** Conventional Commits: https://www.conventionalcommits.org/en/v1.0.0/
- Examples:
  - `fix(parser): handle empty token stream`
  - `docs(readme): add quickstart example`
  - `chore(ci): pin action versions`

## Pull Request Titles & Descriptions
- **PR Title format:** `TYPE: Short summary`
  - Type is **all caps**, from a conventional-commit-like set (e.g., FIX, ENH, MNT, DOC, CI, CHORE).
  - **No scope parenthetical** in PR titles.
- **Examples:**
  - `FIX: Address one-off bug in traversing list`
  - `DOC: Complete docstring with missing arguments`
- **PR Description should include:**
  - Summary of changes
  - Motivation / context
  - Testing performed (exact commands)

## Linting & Pre-Change Validation
- **Always run linting before proposing changes.**
- This repository uses the GitHub Actions linting command:
  - `pipx run ruff format --diff`
- If linting cannot run due to environment constraints, state the limitation and suggest a retry in a fully configured environment.


================================================
FILE: CHANGES.rst
================================================
25.0.0 (TBD)
============
A new 25.x series.

CHANGES
-------
  * FIX: Decode bytes to produce a string (#1371)
  * FIX: Containers report wrong version (#1357)
  * FIX: Elapsed run time format (#1366)
  * FIX: Passing ``bytes`` into ``str.join()`` (#1356)
  * FIX: Optimize interface to minimize memory fingerprint (#1351)
  * ENH: Remove redundant *DIPY* function (#1369)
  * DOC: Add a HPC troubleshooting section to the documentation (#1349)
  * DOC: Provide a range of years ending with current for the copyright statement (#1359)
  * DOC: Fix missing code block start (#1368)
  * DOC: Reorganize documentation and redirect to *NiPreps* docs (#1367)

24.0.2 (August 26, 2024)
========================
A patch release with bugfixes and enhancements.

CHANGES
-------

* FIX: Pin latest *NiReports* release (24.0.2) addressing ``fMRIPlot`` issues by @oesteban (`#1342 <https://github.com/nipreps/mriqc/pull/1342>`__)
* FIX: Edge artifacts in first and last slices due to interpolation by @oesteban (`#1338 <https://github.com/nipreps/mriqc/pull/1338>`__)
* FIX: Normalize bids-filters' modality keys to be lowercase by @oesteban (`#1332 <https://github.com/nipreps/mriqc/pull/1332>`__)
* ENH: Add license NOTICE to start banner by @oesteban (`#1343 <https://github.com/nipreps/mriqc/pull/1343>`__)
* ENH: Enable writing crashfiles in compressed-pickle format by @oesteban (`#1339 <https://github.com/nipreps/mriqc/pull/1339>`__)
* ENH: Use ``orjson`` to serialize JSON, addressing *Numpy* serialization issues by @oesteban (`#1337 <https://github.com/nipreps/mriqc/pull/1337>`__)
* ENH: Handle WebAPI timeouts more gently by @oesteban (`#1336 <https://github.com/nipreps/mriqc/pull/1336>`__)


24.0.1 (August 20, 2024)
========================
A patch release with a large number of bugfixes (mostly focusing on memory issues), maintenance
activities, and metadata crawling before *Nipype* kicks in as a major optimization.

With thanks to @jhlegarreta for his first contribution in `#1293 <https://github.com/nipreps/mriqc/pull/1293>__`.

.. admonition:: Author list for papers based on *MRIQC* 24.0 series

    As described in the `Contributor Guidelines
    <https://www.nipreps.org/community/CONTRIBUTING/#recognizing-contributions>`__,
    anyone listed as a developer or contributor may write and submit manuscripts
    about *MRIQC*.
    To do so, please move the author(s) name(s) to the front of the following list:

    Christopher J. Markiewicz \ :sup:`1`\ ; Zvi Baratz \ :sup:`2`\ ; Eilidh MacNicol \ :sup:`3`\ ; Céline Provins \ :sup:`4`\ ; Teresa Gomez \ :sup:`5`\ ; Dylan Nielson \ :sup:`6`\ ; Ross W. Blair \ :sup:`1`\ ; Jan Varada \ :sup:`7`\ ; Dimitri Papadopoulos Orfanos \ :sup:`8`\ ; William Triplett \ :sup:`9`\ ; Mathias Goncalves \ :sup:`1`\ ; Nikita Beliy \ :sup:`10`\ ; John A. Lee \ :sup:`11`\ ; Yibei Chen \ :sup:`12`\ ; Ursula A. Tooley \ :sup:`13`\ ; Patrick Sadil \ :sup:`14`\ ; Yaroslav O. Halchenko \ :sup:`15`\ ; James D. Kent \ :sup:`16`\ ; Taylor Salo \ :sup:`17`\ ; Bennet Fauber \ :sup:`18`\ ; Thomas Nichols \ :sup:`19`\ ; Pablo Velasco \ :sup:`20`\ ; Michael Krause \ :sup:`21`\ ; Jon Haitz Legarreta Gorroño \ :sup:`22`\ ; Satrajit S. Ghosh \ :sup:`23`\ ; Joke Durnez \ :sup:`1`\ ; Johannes Achtzehn \ :sup:`24`\ ; Elodie Savary \ :sup:`4`\ ; Adam Huffman \ :sup:`25`\ ; Rafael Garcia-Dias \ :sup:`26`\ ; Michael G. Clark \ :sup:`27`\ ; Michael Dayan \ :sup:`28`\ ; McKenzie P. Hagen \ :sup:`29`\ ; Daniel Birman \ :sup:`1`\ ; Benjamin Kay \ :sup:`30`\ ; Asier Erramuzpe \ :sup:`31`\ ; Adam C. Raikes \ :sup:`32`\ ; Adam G. Thomas \ :sup:`33`\ ; Russell A. Poldrack \ :sup:`1`\ ; Ariel Rokem \ :sup:`5`\ ; Oscar Esteban \ :sup:`4`\ .

    Affiliations:

      1. Department of Psychology, Stanford University, CA, USA
      2. Quantivly Inc., Somerville, MA, USA
      3. Department of Neuroimaging, Institute of Psychiatry, Psychology and Neuroscience, King's College London, London, UK
      4. Department of Radiology, Lausanne University Hospital and University of Lausanne, Switzerland
      5. The University of Washington eScience Institute, WA, USA
      6. Section on Clinical and Computational Psychiatry, National Institute of Mental Health, Bethesda, MD, USA
      7. Functional MRI Facility, National Institute of Mental Health, Bethesda, MD, USA
      8. NeuroSpin, CEA, Université Paris-Saclay, NeuroSpin, Gif-sur-Yvette, France
      9. University of Florida: Gainesville, Florida, US
      10. CRC ULiege, Liege, Belgium
      11. Quansight, Dublin, Ireland
      12. McGovern Institute for Brain Research, Massachusetts Institute of Technology, Cambridge, USA
      13. Department of Neuroscience, University of Pennsylvania, PA, USA
      14. Johns Hopkins Bloomberg School of Public Health, MD, USA
      15. Psychological and Brain Sciences Department, Dartmouth College, NH, USA
      16. Department of Psychology, University of Texas at Austin, TX, USA
      17. Department of Psychology, Florida International University, FL, USA
      18. University of Michigan, Ann Arbor, USA
      19. Oxford Big Data Institute, University of Oxford, Oxford, GB
      20. Center for Brain Imaging, New York University, NY, USA
      21. Max Planck Institute for Human Development, Berlin, Germany
      22. Brigham and Women's Hospital, Mass General Brigham, Harvard Medical School, MA, USA
      23. McGovern Institute for Brain Research, MIT, MA, USA; and Department of Otolaryngology, Harvard Medical School, MA, USA
      24. Charité Berlin, Berlin, Germany
      25. Department of Physics, Imperial College London, London, UK
      26. Institute of Psychiatry, Psychology & Neuroscience, King's College London, London, UK
      27. National Institutes of Health, USA
      28. International Committee of the Red Cross - ICRC, Geneva, Switzerland
      29. Psychology Department, University of Washington, Seattle, WA, USA
      30. Washington University School of Medicine, St.Louis, MO, USA
      31. Computational Neuroimaging Lab, BioCruces Health Research Institute
      32. Center for Innovation in Brain Science, University of Arizona, Tucson, AZ, USA
      33. Data Science and Sharing Team, National Institute of Mental Health, Bethesda, MD, USA

CHANGES
-------

* FIX: Multiecho fMRI crashing with 'unhashable type' errors by @oesteban in https://github.com/nipreps/mriqc/pull/1295
* FIX: Set ``n_procs`` instead of ``num_threads`` on node ``apply_hmc`` by @oesteban in https://github.com/nipreps/mriqc/pull/1309
* FIX: Address memory issues by limiting ``BigPlot``'s parallelization. by @oesteban in https://github.com/nipreps/mriqc/pull/1320
* FIX: Address memory issues in the DWI pipeline by @oesteban in https://github.com/nipreps/mriqc/pull/1323
* FIX: Limit IQMs' node number of processes and, therefore, memory by @oesteban in https://github.com/nipreps/mriqc/pull/1325
* FIX: Resolve numeric overflow in drift estimation node by @oesteban in https://github.com/nipreps/mriqc/pull/1324
* FIX: Revise bugfix #1324 by @oesteban in https://github.com/nipreps/mriqc/pull/1327
* FIX: Remove unreachable code within DWI pipeline by @oesteban in https://github.com/nipreps/mriqc/pull/1328
* ENH: Allow moving the cache folder with an environment variable by @oesteban in https://github.com/nipreps/mriqc/pull/1285
* ENH: Flatten multi-echo lists in circumstances that they fail by @oesteban in https://github.com/nipreps/mriqc/pull/1286
* ENH: Added type hints to config module by @zvi-quantivly in https://github.com/nipreps/mriqc/pull/1288
* ENH: Add test for the CLI parser by @jhlegarreta in https://github.com/nipreps/mriqc/pull/1293
* ENH: Add CLI entry point test by @jhlegarreta in https://github.com/nipreps/mriqc/pull/1294
* ENH: Add a development Dockerfile for testing local changes to the repo. by @rwblair in https://github.com/nipreps/mriqc/pull/1299
* ENH: Crawl dataset's metadata only once and before Nipype's workflow by @oesteban in https://github.com/nipreps/mriqc/pull/1317
* ENH(dMRI): Deal gracefully with small CC masks by @oesteban in https://github.com/nipreps/mriqc/pull/1311
* ENH: Leverage new spun-off apply interface by @oesteban in https://github.com/nipreps/mriqc/pull/1313
* MAINT: Removed personal information from maintainers and updated in contributors by @zvi-quantivly in https://github.com/nipreps/mriqc/pull/1289
* MAINT: Add JHLegarreta to the contributors list by @jhlegarreta in https://github.com/nipreps/mriqc/pull/1301
* MAINT: Flexibilize pandas pinned version by @oesteban in https://github.com/nipreps/mriqc/pull/1310
* MAINT: Remove *Pandas*'s ``FutureWarning`` by @oesteban in https://github.com/nipreps/mriqc/pull/1326
* DOC: Add description of ``summary_fg`` to the documentation by @celprov in https://github.com/nipreps/mriqc/pull/1306
* STY: Apply ruff/flake8-implicit-str-concat rule ISC001 by @DimitriPapadopoulos in https://github.com/nipreps/mriqc/pull/1296
* STY: Format *Jupyter notebooks* by @oesteban in https://github.com/nipreps/mriqc/pull/1321

**Full Changelog**: https://github.com/nipreps/mriqc/compare/24.0.0...24.0.1

24.0.0 (April 17, 2024)
=======================
Initial major release of 2024, featuring the **extraction of IQMs from DWI data**
for the first time in *MRIQC*'s timeline.

CHANGES
-------

* FIX: Bug in *toml* loader crashing with mixed arrays in config (#1281)
* FIX: Remove *DataLad* as a node (#1278)
* FIX: Calculation of trivial shells (#1276)
* FIX: Finalized naming and connection of DWI IQMs (#1272)
* FIX: Enable group reports for DWI (#1266)
* FIX: Address issues that had broken the group reports (#1262)
* FIX: Select filters if modalities are selected (#1261)
* FIX: Make sure new logs and config file output are compatible with parallel processes (#1259)
* FIX: Skip short BOLD runs that break outlier detection (#1120)
* FIX: Revise config save/load and update inputs after dropping (#1245)
* FIX: Drift should not be estimated when less than three low-b volumes present (#1242, #1243)
* FIX: Handle ``NUMEXPR_MAX_THREADS`` like ``OMP_NUM_THREADS`` (#1241)
* FIX: Exclude DWI runs with insufficient orientations or missing bvals (#1240)
* FIX: Avert costly ``BIDSLayout.__repr__`` calls when saving config (#1239)
* FIX: Duplicate node in anatomical workflow (#1234)
* FIX: Typo in ``sorted(..., reverse=True)`` call (#1211)
* ENH: Fail for non-formatted code (#1274)
* ENH: Annotate nodes with ``n_procs`` to allow safe parallelization (#1277)
* ENH: Mechanism to protect config's fields and write out config (#1258)
* ENH: Improve documentation and logging of *SynthStrip*'s model (#1254)
* ENH: Improve logging of runtime (#1253)
* ENH: Expose a command-line option for minimum DWI volumes (#1249)
* ENH: Improve error handling and logging (#1238)
* ENH: Add *b*-vector angular deviations as IQMs (#1233)
* ENH: Move from DTI to DKI with multishell data (#1230)
* ENH: Noise floor estimated with PCA (``dwidenoise``) as an IQM (#1229)
* ENH: Integrate PIESNO noise mask and sigma estimation (#1227)
* ENH: Use MAD for robust estimation of sigma in the CC mask (#1228)
* ENH: Add new IQM for DWI → NDC (#1226)
* ENH: Add FA-based IQMs (nans percentage and degenerate percentage) (#1225)
* ENH: Add computation of spiking voxels mask and percent IQMs (#1224)
* ENH: Adds diffusion-related IQMs. (#1131)
* ENH: Revise summary stats extraction and include controlled roundings (#1219)
* DOC: Add changelog to documentation (#1217)
* MAINT: Added ruff to development dependencies (#1271)
* MAINT: Removed pre-commit from development dependencies (#1269)
* MAINT: Clean up more ``FutureWarning`` issued by *Pandas* (#1257)
* MAINT: Prevent pandas-originating deprecation warning (#1251)
* MAINT: Move GitHub Actions and config files from *flake8* → *ruff* (#1212)
* MAINT: Update contributor affiliation in ``CONTRIBUTORS.md`` (#1214)
* STY: Reformat diffusion workflows module (#1279)
* STY: Applied ruff formatting (#1273)

23.1.1 (March 20, 2024)
=======================
A long-overdue hotfix release addressing many bugs generated during the development
of the new dMRI workflows, and some relating to improvements of the handling of
multi-echo fMRI.
The release also include one year-worth of maintenance actions and a general code
cleanup with *Ruff*.

CHANGES
-------

* FIX: Missing connection to head-motion estimation node in DWI workflow by `@oesteban <https://github.com/@oesteban>`__ in `#1207 <https://github.com/nipreps/mriqc/pull/1207>`__
* FIX: Revise porting to ``Loader`` by `@oesteban <https://github.com/@oesteban>`__ in `#1201 <https://github.com/nipreps/mriqc/pull/1201>`__
* FIX: Revise the last two sloppy merges by `@oesteban <https://github.com/@oesteban>`__ in `#1200 <https://github.com/nipreps/mriqc/pull/1200>`__
* FIX: Move from ``pkg_resources`` to ``niworkflows.data.Loader`` by `@oesteban <https://github.com/@oesteban>`__ in `#1199 <https://github.com/nipreps/mriqc/pull/1199>`__
* FIX: DIPY not listed as a dependency by `@oesteban <https://github.com/@oesteban>`__ in `#1197 <https://github.com/nipreps/mriqc/pull/1197>`__
* FIX: Include ``dwidenoise`` within Docker image by `@oesteban <https://github.com/@oesteban>`__ in `#1196 <https://github.com/nipreps/mriqc/pull/1196>`__
* FIX: Copy name attribute of ``dataset_description.json`` from input dataset by `@celprov <https://github.com/@celprov>`__ in `#1187 <https://github.com/nipreps/mriqc/pull/1187>`__
* FIX: Remove FD as an ``iterfield`` in ``MapNode`` causing crash with ME-BOLD by `@celprov <https://github.com/@celprov>`__ in `#1179 <https://github.com/nipreps/mriqc/pull/1179>`__
* FIX: Incorrect plugin metadata passed to *Report Assembler* by `@oesteban <https://github.com/@oesteban>`__ in `#1188 <https://github.com/nipreps/mriqc/pull/1188>`__
* FIX: Temporary fix of the missing ``"dwi"`` key by `@celprov <https://github.com/@celprov>`__ in `#1174 <https://github.com/nipreps/mriqc/pull/1174>`__
* FIX: Rearrange multi-echo report by `@celprov <https://github.com/@celprov>`__ in `#1164 <https://github.com/nipreps/mriqc/pull/1164>`__
* FIX: Typo in ``inputnode`` field in dMRI masking workflow by `@celprov <https://github.com/@celprov>`__ in `#1165 <https://github.com/nipreps/mriqc/pull/1165>`__
* FIX: Bug in group level workflow by `@celprov <https://github.com/@celprov>`__ in `#1148 <https://github.com/nipreps/mriqc/pull/1148>`__
* FIX: Bugs in DWI workflow by `@celprov <https://github.com/@celprov>`__ in `#1147 <https://github.com/nipreps/mriqc/pull/1147>`__
* FIX: Use simpler DWI reference workflow by `@yibeichan <https://github.com/@yibeichan>`__ in `#1145 <https://github.com/nipreps/mriqc/pull/1145>`__
* FIX: Drop deprecated *Networkx*'s API by `@celprov <https://github.com/@celprov>`__ in `#1137 <https://github.com/nipreps/mriqc/pull/1137>`__
* FIX: Replace ``np.float`` by ``np.float64`` by `@celprov <https://github.com/@celprov>`__ in `#1140 <https://github.com/nipreps/mriqc/pull/1140>`__
* ENH: Improved logging and optimize early checkpoint on subjects by `@oesteban <https://github.com/@oesteban>`__ in `#1198 <https://github.com/nipreps/mriqc/pull/1198>`__
* ENH: Store confound timeseries data by `@psadil <https://github.com/@psadil>`__ in `#1166 <https://github.com/nipreps/mriqc/pull/1166>`__
* ENH: Large overhaul of the functional workflow w/focus on ME-EPI by `@oesteban <https://github.com/@oesteban>`__ in `#1155 <https://github.com/nipreps/mriqc/pull/1155>`__
* ENH: Implement BIDS filters file and drop legacy BIDS querying by `@oesteban <https://github.com/@oesteban>`__ in `#1154 <https://github.com/nipreps/mriqc/pull/1154>`__
* ENH: Swap background and zoomed-in visualizations in anatomical reports by `@oesteban <https://github.com/@oesteban>`__ in `#1151 <https://github.com/nipreps/mriqc/pull/1151>`__
* MAINT: Test on *Python* 3.12 by `@DimitriPapadopoulos <https://github.com/@DimitriPapadopoulos>`__ in `#1156 <https://github.com/nipreps/mriqc/pull/1156>`__
* MAINT: Disable flaky T1w test on CircleCI by `@oesteban <https://github.com/@oesteban>`__ in `#1202 <https://github.com/nipreps/mriqc/pull/1202>`__
* MAINT: Overhaul of the ``Dockerfile`` by `@oesteban <https://github.com/@oesteban>`__ in `#1195 <https://github.com/nipreps/mriqc/pull/1195>`__
* MAINT: Revise package's extra dependencies by `@oesteban <https://github.com/@oesteban>`__ in `#1194 <https://github.com/nipreps/mriqc/pull/1194>`__
* MAINT: Clean up some ``setuptools_scm`` remnants by `@oesteban <https://github.com/@oesteban>`__ in `#1193 <https://github.com/nipreps/mriqc/pull/1193>`__
* MAINT: Load ``FMRISummary`` from *NiReports* rather than *NiWorkflows* by `@celprov <https://github.com/@celprov>`__ in `#1167 <https://github.com/nipreps/mriqc/pull/1167>`__
* MAINT: Update to latest *migas*' API by `@mgxd <https://github.com/@mgxd>`__ in `#1160 <https://github.com/nipreps/mriqc/pull/1160>`__
* MAINT: Update bold to large resource class in ``config.yml`` by `@oesteban <https://github.com/@oesteban>`__ in `#1158 <https://github.com/nipreps/mriqc/pull/1158>`__
* MAINT: Refresh cached intermediate results by `@oesteban <https://github.com/@oesteban>`__ in `#1143 <https://github.com/nipreps/mriqc/pull/1143>`__
* MAINT: Simplify GitHub actions checks and update action versions by `@effigies <https://github.com/@effigies>`__ in `#1141 <https://github.com/nipreps/mriqc/pull/1141>`__
* MAINT: Python 3.11 is supported by `@DimitriPapadopoulos <https://github.com/@DimitriPapadopoulos>`__ in `#1123 <https://github.com/nipreps/mriqc/pull/1123>`__
* MAINT: Apply suggestions from pyupgrade by `@DimitriPapadopoulos <https://github.com/@DimitriPapadopoulos>`__ in `#1124 <https://github.com/nipreps/mriqc/pull/1124>`__
* DOC: Update *Sphinx* pinned version to 5 by `@oesteban <https://github.com/@oesteban>`__ in `#1192 <https://github.com/nipreps/mriqc/pull/1192>`__
* DOC: http:// → https:// by `@DimitriPapadopoulos <https://github.com/@DimitriPapadopoulos>`__ in `#1126 <https://github.com/nipreps/mriqc/pull/1126>`__
* DOC: Add info on the *FreeSurfer* requirement for bare install to address #1034 by `@neurorepro <https://github.com/@neurorepro>`__ in `#1130 <https://github.com/nipreps/mriqc/pull/1130>`__
* STY: Add *Ruff* config and fix all warnings and errors by `@oesteban <https://github.com/@oesteban>`__ in `#1203 <https://github.com/nipreps/mriqc/pull/1203>`__
* STY: Remove extraneous parentheses by `@DimitriPapadopoulos <https://github.com/@DimitriPapadopoulos>`__ in `#1186 <https://github.com/nipreps/mriqc/pull/1186>`__
* STY: Apply a few refurb suggestions by `@DimitriPapadopoulos <https://github.com/@DimitriPapadopoulos>`__ in `#1162 <https://github.com/nipreps/mriqc/pull/1162>`__
* STY: Fix typo found by codespell by `@DimitriPapadopoulos <https://github.com/@DimitriPapadopoulos>`__ in `#1161 <https://github.com/nipreps/mriqc/pull/1161>`__

23.1.0 (June 14, 2023)
======================
A new minor release featuring the new individual reports built with the new
*NiReports* VRS (visual reports system). This means *MRIQC* now uses the same
package *fMRIPrep* uses for generating its reports. In addition to that,
this new release also features *Beta* support for diffusion MRI (dMRI). 

CHANGES
-------

* FIX: Better handling of BIDS cached indexation (`#1121 <https://github.com/nipreps/mriqc/pull/1121>`__)
* FIX: Make doctest of ``NumberOfShells`` more reliable (`#1122 <https://github.com/nipreps/mriqc/pull/1122>`__)
* FIX: Add protection for NaNs and INFs when calculating QI2 (`#1112 <https://github.com/nipreps/mriqc/pull/1112>`__)
* FIX: ``PlotMosaic`` expects lists, not tuples (`#1111 <https://github.com/nipreps/mriqc/pull/1111>`__)
* FIX: BIDS database directory handling (`#1110 <https://github.com/nipreps/mriqc/pull/1110>`__)
* FIX: Remove unused dipy import in the functional interfaces (`#1109 <https://github.com/nipreps/mriqc/pull/1109>`__)
* FIX: Refine the head mask after removal of FSL BET (`#1107 <https://github.com/nipreps/mriqc/pull/1107>`__)
* FIX: Inform *SynthStrip* about the desired intraop threads (`#1101 <https://github.com/nipreps/mriqc/pull/1101>`__)
* FIX: Test broken by #1098 (`#1100 <https://github.com/nipreps/mriqc/pull/1100>`__)
* FIX: Separate report bootstrap files (anat vs. func) (`#1098 <https://github.com/nipreps/mriqc/pull/1098>`__)
* FIX: Propagate logging level to subprocesses (`#1030 <https://github.com/nipreps/mriqc/pull/1030>`__)
* ENH: Incorporate new NiReports' DWI heatmaps (`#1119 <https://github.com/nipreps/mriqc/pull/1119>`__)
* ENH: More compact of shell-wise summary statistic maps (avg/std) (`#1116 <https://github.com/nipreps/mriqc/pull/1116>`__)
* ENH: Add a basic DTI fitting into the diffusion workflow (`#1115 <https://github.com/nipreps/mriqc/pull/1115>`__)
* ENH: MRIQC for DWI (`#1113 <https://github.com/nipreps/mriqc/pull/1113>`__)
* ENH: Culminate dropping FSL as a dependency (`#1108 <https://github.com/nipreps/mriqc/pull/1108>`__)
* ENH: Replace FSL FAST with ANTs Atropos for brain tissue segmentation (`#1099 <https://github.com/nipreps/mriqc/pull/1099>`__)
* ENH: Drop FSL MELODIC (without alternative) (`#1106 <https://github.com/nipreps/mriqc/pull/1106>`__)
* ENH: Drop FSL BET to estimate the "outskin" (head) mask (`#1105 <https://github.com/nipreps/mriqc/pull/1105>`__)
* ENH: Drop utilization of "head" mask from template (`#1104 <https://github.com/nipreps/mriqc/pull/1104>`__)
* ENH: Move templates' probsegs into individual at normalization (`#1103 <https://github.com/nipreps/mriqc/pull/1103>`__)
* ENH: Improving the resource monitor -- infer PID from process name (`#1049 <https://github.com/nipreps/mriqc/pull/1049>`__) (`#1049 <https://github.com/nipreps/mriqc/pull/1049>`__)
* ENH: Refactor reports system to use *NiReports* and the general VRS (`#1085 <https://github.com/nipreps/mriqc/pull/1085>`__)
* MAINT: Move codespell configuration to ``pyproject.toml`` (`#1097 <https://github.com/nipreps/mriqc/pull/1097>`__)
* MAINT: Update deprecated ``nibabel.spatialimage.get_data()`` calls (`#1096 <https://github.com/nipreps/mriqc/pull/1096>`__)

.. admonition:: Author list for papers based on *MRIQC* 23.0 series

    As described in the `Contributor Guidelines
    <https://www.nipreps.org/community/CONTRIBUTING/#recognizing-contributions>`__,
    anyone listed as developer or contributor may write and submit manuscripts
    about *MRIQC*.
    To do so, please move the author(s) name(s) to the front of the following list:
    
    Zvi Baratz \ :sup:`1`\ ; Christopher J. Markiewicz \ :sup:`2`\ ; Eilidh MacNicol \ :sup:`3`\ ; Dylan Nielson \ :sup:`4`\ ; Jan Varada \ :sup:`5`\ ; Ross W. Blair \ :sup:`2`\ ; Céline Provins \ :sup:`6`\ ; William Triplett \ :sup:`7`\ ; Mathias Goncalves \ :sup:`2`\ ; Nikita Beliy \ :sup:`8`\ ; John A. Lee \ :sup:`9`\ ; Ursula A. Tooley \ :sup:`10`\ ; James D. Kent \ :sup:`11`\ ; Yaroslav O. Halchenko \ :sup:`12`\ ; Bennet Fauber \ :sup:`13`\ ; Taylor Salo \ :sup:`14`\ ; Michael Krause \ :sup:`15`\ ; Pablo Velasco \ :sup:`16`\ ; Thomas Nichols \ :sup:`17`\ ; Adam Huffman \ :sup:`18`\ ; Elodie Savary \ :sup:`6`\ ; Johannes Achtzehn \ :sup:`19`\ ; Joke Durnez \ :sup:`2`\ ; Satrajit S. Ghosh \ :sup:`20`\ ; Asier Erramuzpe \ :sup:`21`\ ; Benjamin Kay \ :sup:`22`\ ; Daniel Birman \ :sup:`2`\ ; McKenzie P. Hagen \ :sup:`23`\ ; Michael G. Clark \ :sup:`24`\ ; Patrick Sadil \ :sup:`25`\ ; Rafael Garcia-Dias \ :sup:`26`\ ; Adam G. Thomas \ :sup:`27`\ ; Russell A. Poldrack \ :sup:`2`\ ; Ariel Rokem \ :sup:`28`\ ; Oscar Esteban \ :sup:`6`\ .

    Affiliations:

      1. Sagol School of Neuroscience, Tel Aviv University, Tel Aviv, Israel
      2. Department of Psychology, Stanford University, CA, USA
      3. Department of Neuroimaging, Institute of Psychiatry, Psychology and Neuroscience, King's College London, London, UK
      4. Section on Clinical and Computational Psychiatry, National Institute of Mental Health, Bethesda, MD, USA
      5. Functional MRI Facility, National Institute of Mental Health, Bethesda, MD, USA
      6. Department of Radiology, Lausanne University Hospital and University of Lausanne, Switzerland
      7. University of Florida: Gainesville, Florida, US
      8. CRC ULiege, Liege, Belgium
      9. Quansight, Dublin, Ireland
      10. Department of Neuroscience, University of Pennsylvania, PA, USA
      11. Department of Psychology, University of Texas at Austin, TX, USA
      12. Psychological and Brain Sciences Department, Dartmouth College, NH, USA
      13. University of Michigan, Ann Arbor, USA
      14. Department of Psychology, Florida International University, FL, USA
      15. Max Planck Institute for Human Development, Berlin, Germany
      16. Center for Brain Imaging, New York University, NY, USA
      17. Oxford Big Data Institute, University of Oxford, Oxford, GB
      18. Department of Physics, Imperial College London, London, UK
      19. Charité Berlin, Berlin, Germany
      20. McGovern Institute for Brain Research, MIT, MA, USA; and Department of Otolaryngology, Harvard Medical School, MA, USA
      21. Computational Neuroimaging Lab, BioCruces Health Research Institute
      22. Washington University School of Medicine, St.Louis, MO, USA
      23. Psychology Department, University of Washington, Seattle, WA, USA
      24. National Institutes of Health, USA
      25. Johns Hopkins Bloomberg School of Public Health, MD, USA
      26. Institute of Psychiatry, Psychology & Neuroscience, King's College London, London, UK
      27. Data Science and Sharing Team, National Institute of Mental Health, Bethesda, MD, USA
      28. The University of Washington eScience Institute, WA, USA

23.0.1 (March 24, 2023)
=======================
A hotfix release resolving a reggression introduced with the new optimized indexing.

* FIX: Underspecified regex sets ``BIDSLayout`` to ignore data with sessions (`#1094 <https://github.com/nipreps/mriqc/pull/1094>`__)
* FIX: Input data has incompatible dimensionality (plotting ICA) (`#1082 <https://github.com/nipreps/mriqc/pull/1082>`__)
* ENH: Optimize metadata gathering reusing ``BIDSLayout`` db (`#1084 <https://github.com/nipreps/mriqc/pull/1084>`__)
* DOC : update anatomical example report in documentation (`#1088 <https://github.com/nipreps/mriqc/pull/1088>`__)
* MAINT: Drop old ``mriqc_plot`` script (`#1091 <https://github.com/nipreps/mriqc/pull/1091>`__)

23.0.0 (March 10, 2023)
=======================
The new 23.0.x series include several prominent changes.
Visualization has been migrated from *MRIQC* and *niworkflows* over to the new *NiReports* project.
This series include a major bugfix with **the optimization of the indexing** of the input BIDS folder,
which was taking large times with sizeable datasets.
Telemetry has also been incorporated with *migas*.
These new series also involve maintenance housekeeping, and includes some relevant bugfixes.

New contributors
----------------

* `@arokem <https://github.com/arokem>`__ made their first contribution in `#1040 <https://github.com/nipreps/mriqc/pull/1040>`__
* `@yarikoptic <https://github.com/yarikoptic>`__ made their first contribution in `#1057 <https://github.com/nipreps/mriqc/pull/1057>`__
* `@esavary <https://github.com/esavary>`__ made their first contribution in `#1047 <https://github.com/nipreps/mriqc/pull/1047>`__

CHANGES
-------
**Full Changelog**: https://github.com/nipreps/mriqc/compare/22.0.6...23.0.0

* FIX: Send metadata extraction to workers (functional workflow) (`#1081 <https://github.com/nipreps/mriqc/pull/1081>`__)
* FIX: Plot coronal as main plain for mosaic of rodent images (`#1027 <https://github.com/nipreps/mriqc/pull/1027>`__)
* FIX: Address non-empty take from empty axes (anatomical IQMs) (`#1077 <https://github.com/nipreps/mriqc/pull/1077>`__)
* FIX: Uniformize building workflow message (anat vs. func) (`#1072 <https://github.com/nipreps/mriqc/pull/1072>`__)
* FIX: Move telemetry atexit into entrypoint func (`#1067 <https://github.com/nipreps/mriqc/pull/1067>`__)
* FIX: Preempt PyBIDS to spend time indexing non-BIDS folders (`#1050 <https://github.com/nipreps/mriqc/pull/1050>`__)
* FIX: Update T1w metrics (`#1063 <https://github.com/nipreps/mriqc/pull/1063>`__)
* FIX: Resource monitor would not ever start tracking (`#1051 <https://github.com/nipreps/mriqc/pull/1051>`__)
* ENH: Add DataLad getter to inputs of functional workflows (`#1071 <https://github.com/nipreps/mriqc/pull/1071>`__)
* ENH: Add migas telemetry (`#1036 <https://github.com/nipreps/mriqc/pull/1036>`__)
* ENH: Add codespell automation: config, action, and typos fixed (`#1057 <https://github.com/nipreps/mriqc/pull/1057>`__)
* MAINT: Update *NiReports* calls to upcoming interfaces API (`#1078 <https://github.com/nipreps/mriqc/pull/1078>`__)
* MAINT: Pacify codespell (`#1080 <https://github.com/nipreps/mriqc/pull/1080>`__)
* MAINT: Conclude porting of reportlets into *NiReports* (`#1068 <https://github.com/nipreps/mriqc/pull/1068>`__)
* MAINT: Migrate to hatchling (`#1070 <https://github.com/nipreps/mriqc/pull/1070>`__)
* MAINT: Pin PyBIDS 0.15.6 (culminating #1050) (`#1069 <https://github.com/nipreps/mriqc/pull/1069>`__)
* MAINT: Update niworkflows pin to support newer ANTs releases (`#1047 <https://github.com/nipreps/mriqc/pull/1047>`__)
* MAINT: Fix minor aspects of WebAPI deployment on CircleCI (`#1064 <https://github.com/nipreps/mriqc/pull/1064>`__)
* MAINT: Update CircleCI executor and use built-in docker-compose (`#1061 <https://github.com/nipreps/mriqc/pull/1061>`__)
* MAINT: Rotate CircleCI secrets and setup up org-level context (`#1046 <https://github.com/nipreps/mriqc/pull/1046>`__)
* DOC: Update documentation with the new carpet plot (`#1045 <https://github.com/nipreps/mriqc/pull/1045>`__)
* DOC: Complete the documentation of ``summary_stats()`` (`#1044 <https://github.com/nipreps/mriqc/pull/1044>`__)
* DOC: Fixes a couple of broken links to the *nipype* documentation (`#1040 <https://github.com/nipreps/mriqc/pull/1040>`__)

.. admonition:: Author list for papers based on *MRIQC* 23.0 series

    As described in the `Contributor Guidelines
    <https://www.nipreps.org/community/CONTRIBUTING/#recognizing-contributions>`__,
    anyone listed as developer or contributor may write and submit manuscripts
    about *MRIQC*.
    To do so, please move the author(s) name(s) to the front of the following list:

    Zvi Baratz \ :sup:`1`\ ; Christopher J. Markiewicz \ :sup:`2`\ ; Eilidh MacNicol \ :sup:`3`\ ; Dylan Nielson \ :sup:`4`\ ; Jan Varada \ :sup:`5`\ ; Ross W. Blair \ :sup:`2`\ ; Céline Provins \ :sup:`6`\ ; William Triplett \ :sup:`7`\ ; Mathias Goncalves \ :sup:`2`\ ; Nikita Beliy \ :sup:`8`\ ; John A. Lee \ :sup:`9`\ ; Ursula A. Tooley \ :sup:`10`\ ; James D. Kent \ :sup:`11`\ ; Yaroslav O. Halchenko \ :sup:`12`\ ; Bennet Fauber \ :sup:`13`\ ; Taylor Salo \ :sup:`14`\ ; Michael Krause \ :sup:`15`\ ; Pablo Velasco \ :sup:`16`\ ; Thomas Nichols \ :sup:`17`\ ; Adam Huffman \ :sup:`18`\ ; Johannes Achtzehn \ :sup:`19`\ ; Joke Durnez \ :sup:`2`\ ; Satrajit S. Ghosh \ :sup:`20`\ ; Asier Erramuzpe \ :sup:`21`\ ; Benjamin Kay \ :sup:`22`\ ; Daniel Birman \ :sup:`2`\ ; Elodie Savary \ :sup:`23`\ ; McKenzie P. Hagen \ :sup:`24`\ ; Michael G. Clark \ :sup:`25`\ ; Patrick Sadil \ :sup:`26`\ ; Rafael Garcia-Dias \ :sup:`27`\ ; Adam G. Thomas \ :sup:`28`\ ; Russell A. Poldrack \ :sup:`2`\ ; Ariel Rokem \ :sup:`29`\ ; Oscar Esteban \ :sup:`30`\ .

    Affiliations:

      1. Sagol School of Neuroscience, Tel Aviv University, Tel Aviv, Israel
      2. Department of Psychology, Stanford University, CA, USA
      3. Department of Neuroimaging, Institute of Psychiatry, Psychology and Neuroscience, King's College London, London, UK
      4. Section on Clinical and Computational Psychiatry, National Institute of Mental Health, Bethesda, MD, USA
      5. Functional MRI Facility, National Institute of Mental Health, Bethesda, MD, USA
      6. Lausanne University Hospital and University of Lausanne, Lausanne, Switzerland
      7. University of Florida: Gainesville, Florida, US
      8. CRC ULiege, Liege, Belgium
      9. Quansight, Dublin, Ireland
      10. Department of Neuroscience, University of Pennsylvania, PA, USA
      11. Department of Psychology, University of Texas at Austin, TX, USA
      12. Psychological and Brain Sciences Department, Dartmouth College, NH, USA
      13. University of Michigan, Ann Arbor, USA
      14. Department of Psychology, Florida International University, FL, USA
      15. Max Planck Institute for Human Development, Berlin, Germany
      16. Center for Brain Imaging, New York University, NY, USA
      17. Oxford Big Data Institute, University of Oxford, Oxford, GB
      18. Department of Physics, Imperial College London, London, UK
      19. Charité Berlin, Berlin, Germany
      20. McGovern Institute for Brain Research, MIT, MA, USA; and Department of Otolaryngology, Harvard Medical School, MA, USA
      21. Computational Neuroimaging Lab, BioCruces Health Research Institute
      22. Washington University School of Medicine, St.Louis, MO, USA
      23. Department of Radiology, Lausanne University Hospital and University of Lausanne, Switzerland
      24. Psychology Department, University of Washington, Seattle, WA, USA
      25. National Institutes of Health, USA
      26. Johns Hopkins Bloomberg School of Public Health, MD, USA
      27. Institute of Psychiatry, Psychology & Neuroscience, King's College London, London, UK
      28. Data Science and Sharing Team, National Institute of Mental Health, Bethesda, MD, USA
      29. The University of Washington eScience Institute, WA, USA
      30. Department of Radiology, Lausanne University Hospital and University of Lausanne

22.0.6 (August 24, 2022)
========================
A hotfix release partially rolling-back the previous fix #1025.
Thanks everyone for your patience with the excessively rushed release of 22.0.5.

* FIX: Better fix to the multi-argument ``--participant-label`` issue (`#1026 <https://github.com/nipreps/mriqc/pull/1026>`__)

22.0.5 (August 24, 2022)
========================
A hotfix release addressing a problem with the argument parser.

* FIX: Multiple valued ``--participant-label`` wrongly parsed (`#1025 <https://github.com/nipreps/mriqc/pull/1025>`__)

22.0.4 (August 23, 2022)
========================
A hotfix release to ensure smooth operation of datalad within Docker.

* FIX: Major improvements to new datalad-based interface & perform within containers (`#1024 <https://github.com/nipreps/mriqc/pull/1024>`__)
* ENH: Bump Docker base to latest release (`#1022 <https://github.com/nipreps/mriqc/pull/1022>`__)

22.0.3 (August 19, 2022)
========================
A patch release containing a bugfix to the SynthStrip preprocessing.

* FIX: SynthStrip preprocessing miscalculating new shape after reorientation (`#1021 <https://github.com/nipreps/mriqc/pull/1021>`__)
* ENH: Remove slice-timing correction (`#1019 <https://github.com/nipreps/mriqc/pull/1019>`__)
* ENH: Add a new ``DataladIdentityInterface`` (`#1020 <https://github.com/nipreps/mriqc/pull/1020>`__)
* ENH: Set rat-specific defaults for FD calculations (`#1005 <https://github.com/nipreps/mriqc/pull/1005>`__)
* ENH: New version of the rating widget (`#1012 <https://github.com/nipreps/mriqc/pull/1012>`__)
* DOC: Move readthedocs to use the config v2 file (YAML) (`#1018 <https://github.com/nipreps/mriqc/pull/1018>`__)
* MAINT: Fix statsmodels dependency, it is not optional (`#1017 <https://github.com/nipreps/mriqc/pull/1017>`__)
* MAINT: Several critical updates to CircleCI and Docker images (`#1016 <https://github.com/nipreps/mriqc/pull/1016>`__)
* MAINT: Update the T1w IQMs to the new reference after #997 (`#1014 <https://github.com/nipreps/mriqc/pull/1014>`__)
* MAINT: Fix failing tests as ``python setup.py`` is deprecated (`#1013 <https://github.com/nipreps/mriqc/pull/1013>`__)

22.0.2 (August 15, 2022)
========================
A patch release including the new ratings widget.

* ENH: New version of the rating widget (`#1012 <https://github.com/nipreps/mriqc/pull/1012>`__)
* DOC: Move readthedocs to use the config v2 file (YAML) (`#1018 <https://github.com/nipreps/mriqc/pull/1018>`__)
* MAINT: Fix ``statsmodels`` dependency, it is not optional (`#1017 <https://github.com/nipreps/mriqc/pull/1017>`__)
* MAINT: Several critical updates to CircleCI and Docker images (`#1016 <https://github.com/nipreps/mriqc/pull/1016>`__)
* MAINT: Update the T1w IQMs to the new reference after #997 (`#1014 <https://github.com/nipreps/mriqc/pull/1014>`__)
* MAINT: Fix failing tests as ``python setup.py`` is deprecated (`#1013 <https://github.com/nipreps/mriqc/pull/1013>`__)

22.0.1 (May 3rd, 2022)
======================
A patch release addressing a new minor bug.

* FIX: More lenient handling of skull-stripped datasets (`#997 <https://github.com/nipreps/mriqc/pull/997>`__)

22.0.0 (May 3rd, 2022)
======================
First official release after migrating the repository into the *NiPreps*' organization.
A major new feature is the rodent pipeline by Eilidh MacNicol (@eilidhmacnicol).
A second major feature is the adoption of the updated carpet plots for BOLD fMRI,
contributed by Céline Provins (@celprov).
Virtual memory allocation has been ten-fold cut down, and a complementary resource monitor instrumentation is now available with *MRIQC*.
This release updates the Docker image with up-to-date dependencies, updates
*MRIQC*'s codebase to the latest *NiTransforms* and includes some minor bugfixes.
The code, modules and data related to the MRIQC classifier have been extracted into an
isolated package called [*MRIQC-learn*](https://github.com/nipreps/mriqc-learn).
Finally, this release also contains a major code style overhaul by Zvi Baratz.

The contributor/author crediting system has been adapted to the current draft of the
*NiPreps Community* Governance documents.

With thanks to @ZviBaratz, @nbeliy, @octomike, @benkay86, @verdurin, @leej3, @utooley,
and @jAchtzehn for their contributions.

* FIX: Inconsistent API in anatomical CNR computation (`#995 <https://github.com/nipreps/mriqc/pull/995>`__)
* FIX: Check sanity of input data before extracting IQMs (`#994 <https://github.com/nipreps/mriqc/pull/994>`__)
* FIX: Plot segmentations after dropping off-diagonal (`#989 <https://github.com/nipreps/mriqc/pull/989>`__)
* FIX: Replace all deprecated ``nibabel.get_data()`` in anatomical module (`#988 <https://github.com/nipreps/mriqc/pull/988>`__)
* FIX: Resource profiler was broken with config file (`#981 <https://github.com/nipreps/mriqc/pull/981>`__)
* FIX: preserve WM segments in rodents (`#979 <https://github.com/nipreps/mriqc/pull/979>`__)
* FIX: Pin ``jinja2 < 3.1`` (`#978 <https://github.com/nipreps/mriqc/pull/978>`__)
* FIX: Make toml config unique, works around #912 (`#960 <https://github.com/nipreps/mriqc/pull/960>`__)
* FIX: Nipype multiproc plugin expects ``n_procs`` and not ``nprocs`` (`#961 <https://github.com/nipreps/mriqc/pull/961>`__)
* FIX: Set TR when generating carpetplots (enables time for X axis) (`#971 <https://github.com/nipreps/mriqc/pull/971>`__)
* FIX: ``template_resolution`` deprecation warning (`#941 <https://github.com/nipreps/mriqc/pull/941>`__)
* FIX: Set entity ``datatype`` in ``BIDSLayout`` queries (`#942 <https://github.com/nipreps/mriqc/pull/942>`__)
* FIX: T2w image of MNI template unavailable in Singularity (`#940 <https://github.com/nipreps/mriqc/pull/940>`__)
* FIX: Release process -- Docker deployment not working + Python package lacks WebAPI token (`#938 <https://github.com/nipreps/mriqc/pull/938>`__)
* FIX: Revise building documentation at RTD after migration (`#935 <https://github.com/nipreps/mriqc/pull/935>`__)
* FIX: Final touch-ups in the maintenance of Docker image + CI (`#928 <https://github.com/nipreps/mriqc/pull/928>`__)
* FIX: Update unit tests (`#927 <https://github.com/nipreps/mriqc/pull/927>`__)
* FIX: Update dependencies and repair BOLD workflow accordingly (`#926 <https://github.com/nipreps/mriqc/pull/926>`__)
* FIX: Update dependencies and repair T1w workflow accordingly (`#925 <https://github.com/nipreps/mriqc/pull/925>`__)
* FIX: Set ``matplotlib`` on ``Agg`` output mode (`#892 <https://github.com/nipreps/mriqc/pull/892>`__)
* ENH: Deprecate ``--start-idx`` / ``--stop-idx`` (`#993 <https://github.com/nipreps/mriqc/pull/993>`__)
* ENH: Add SynthStrip base module (`#987 <https://github.com/nipreps/mriqc/pull/987>`__)
* ENH: Improve building workflow message feedback (`#990 <https://github.com/nipreps/mriqc/pull/990>`__)
* ENH: Add instrumentation to monitor resources (`#984 <https://github.com/nipreps/mriqc/pull/984>`__)
* ENH: Standalone, lightweight version of MultiProc plugin (`#985 <https://github.com/nipreps/mriqc/pull/985>`__)
* ENH: Revise plugin and workflow initialization (`#983 <https://github.com/nipreps/mriqc/pull/983>`__)
* ENH: Base generalization of the pipeline for rodents (`#969 <https://github.com/nipreps/mriqc/pull/969>`__)
* ENH: Update to new *NiWorkflows*' API, which adds the crown to the carpetplot (`#968 <https://github.com/nipreps/mriqc/pull/968>`__)
* ENH: Optimize *PyBIDS*' layout initialization (`#939 <https://github.com/nipreps/mriqc/pull/939>`__)
* ENH: Refactored long strings to a :mod:`mriqc.messages` module (`#901 <https://github.com/nipreps/mriqc/pull/901>`__)
* ENH: Refactored :mod:`mriqc.interfaces.common` module (`#901 <https://github.com/nipreps/mriqc/pull/901>`__)
* DOC: Improve documentation of ``--nprocs`` and ``--omp-nthreads`` (`#986 <https://github.com/nipreps/mriqc/pull/986>`__)
* DOC: Add ``sbatch`` file example for SLURM execution (`#963 <https://github.com/nipreps/mriqc/pull/963>`__)
* DOC: Various fixes to "Running mriqc" section (`#897 <https://github.com/nipreps/mriqc/pull/897>`__)
* MAINT: Refactor ``Dockerfile`` using new miniconda image (`#974 <https://github.com/nipreps/mriqc/pull/974>`__)
* MAINT: Outsource the classifier into nipreps/mriqc-learn (`#973 <https://github.com/nipreps/mriqc/pull/973>`__)
* MAINT: Update ``CONTRIBUTORS.md`` (`#953 <https://github.com/nipreps/mriqc/pull/953>`__)
* MAINT: Update contributor location (`#952 <https://github.com/nipreps/mriqc/pull/952>`__)
* MAINT: Updates to ``CONTRIBUTORS.md`` file
* MAINT: Revise Docker image settings & CircleCI (`#937 <https://github.com/nipreps/mriqc/pull/937>`__)
* MAINT: Finalize transfer to ``nipreps`` organization (`#936 <https://github.com/nipreps/mriqc/pull/936>`__)
* MAINT: Relicensing to Apache-2.0, for compliance with *NiPreps* and prior transfer to the org (`#930 <https://github.com/nipreps/mriqc/pull/930>`__)
* MAINT: New Docker layer caching system of other *NiPreps* (`#929 <https://github.com/nipreps/mriqc/pull/929>`__)
* MAINT: Code style overhaul (`#901 <https://github.com/nipreps/mriqc/pull/901>`__)
* MAINT: Update ``Dockerfile`` and catch-up with *fMRIPrep*'s (`#924 <https://github.com/nipreps/mriqc/pull/924>`__)
* STY: Run ``black`` at the top of the repo (`#932 <https://github.com/nipreps/mriqc/pull/932>`__)

**Full Changelog**: https://github.com/nipreps/mriqc/compare/0.16.1...22.0.0

.. admonition:: Author list for papers based on *MRIQC* 22.0.x

    As described in the `Contributor Guidelines
    <https://www.nipreps.org/community/CONTRIBUTING/#recognizing-contributions>`__,
    anyone listed as developer or contributor may write and submit manuscripts
    about *MRIQC*.
    To do so, please move the author(s) name(s) to the front of the following list:

    Zvi Baratz \ :sup:`1`\ ; Christopher J. Markiewicz \ :sup:`2`\ ; Eilidh MacNicol \ :sup:`3`\ ; Dylan Nielson \ :sup:`4`\ ; Jan Varada \ :sup:`5`\ ; Ross W. Blair \ :sup:`2`\ ; William Triplett \ :sup:`6`\ ; Nikita Beliy \ :sup:`7`\ ; Céline Provins \ :sup:`8`\ ; John A. Lee \ :sup:`9`\ ; Ursula A. Tooley \ :sup:`10`\ ; James D. Kent \ :sup:`11`\ ; Bennet Fauber \ :sup:`12`\ ; Taylor Salo \ :sup:`13`\ ; Mathias Goncalves \ :sup:`2`\ ; Michael Krause \ :sup:`14`\ ; Pablo Velasco \ :sup:`15`\ ; Thomas Nichols \ :sup:`16`\ ; Adam Huffman \ :sup:`17`\ ; Johannes Achtzehn \ :sup:`18`\ ; Joke Durnez \ :sup:`2`\ ; Satrajit S. Ghosh \ :sup:`19`\ ; Asier Erramuzpe \ :sup:`20`\ ; Benjamin Kay \ :sup:`21`\ ; Daniel Birman \ :sup:`2`\ ; Michael G. Clark \ :sup:`22`\ ; Rafael Garcia-Dias \ :sup:`23`\ ; Sean Marret \ :sup:`5`\ ; Adam G. Thomas \ :sup:`24`\ ; Russell A. Poldrack \ :sup:`2`\ ; Krzysztof J. Gorgolewski \ :sup:`25`\ ; Oscar Esteban \ :sup:`26`\ .

    Affiliations:

    1. Sagol School of Neuroscience, Tel-Aviv University
    2. Department of Psychology, Stanford University, CA, USA
    3. Department of Neuroimaging, Institute of Psychiatry, Psychology and Neuroscience, King's College London, London, UK
    4. Section on Clinical and Computational Psychiatry, National Institute of Mental Health, Bethesda, MD, USA
    5. Functional MRI Facility, National Institute of Mental Health, Bethesda, MD, USA
    6. University of Florida: Gainesville, Florida, US
    7. CRC ULiege, Liege, Belgium
    8. Lausanne University Hospital and University of Lausanne, Lausanne, Switzerland
    9. Quansight, Dublin, Ireland
    10. Department of Neuroscience, University of Pennsylvania, PA, USA
    11. Department of Psychology, University of Texas at Austin, TX, USA
    12. University of Michigan, Ann Arbor, USA
    13. Department of Psychology, Florida International University, FL, USA
    14. Max Planck Institute for Human Development, Berlin, Germany
    15. Center for Brain Imaging, New York University, NY, USA
    16. Oxford Big Data Institute, University of Oxford, Oxford, GB
    17. Department of Physics, Imperial College London, London, UK
    18. Charité Berlin, Berlin, Germany
    19. McGovern Institute for Brain Research, MIT, MA, USA; and Department of Otolaryngology, Harvard Medical School, MA, USA
    20. Computational Neuroimaging Lab, BioCruces Health Research Institute
    21. Washington University School of Medicine, St.Louis, MO, USA
    22. National Institutes of Health, USA
    23. Institute of Psychiatry, Psychology & Neuroscience, King's College London, London, UK
    24. Data Science and Sharing Team, National Institute of Mental Health, Bethesda, MD, USA
    25. Google LLC
    26. Department of Radiology, Lausanne University Hospital and University of Lausanne

Series 0.16.x
=============
0.16.1 (January 30, 2021)
-------------------------
Bug-fix release in 0.16.x series.

This PR improves BIDS Derivatives compliance, fixes an issue with reading datasets with
subjects of the form ``sub-sXYZ``, and improves compatibility with more recent matplotlib.

* FIX: Participant labels starting with ``[sub]`` cannot be used (`#890 <https://github.com/nipreps/mriqc/pull/890>`__)
* FIX: Change deprecated ``normed`` to ``density`` in parameters to ``hist()`` (`#888 <https://github.com/nipreps/mriqc/pull/888>`__)
* ENH: Write derivatives metadata (`#885 <https://github.com/nipreps/mriqc/pull/885>`__)
* ENH: Add ``--pdb`` option to make debugging easier (`#884 <https://github.com/nipreps/mriqc/pull/884>`__)

0.16.0 (January 5, 2021)
------------------------
New feature release in 0.16.x series.

This version removes the FSL dependency from the fMRI workflow.

* FIX: Skip version cache on read-only filesystems (`#862 <https://github.com/nipreps/mriqc/pull/862>`__)
* FIX: Honor ``$OMP_NUM_THREADS`` environment variable (`#848 <https://github.com/nipreps/mriqc/pull/848>`__)
* RF: Simplify comprehensions, using easy-to-read var names (`#875 <https://github.com/nipreps/mriqc/pull/875>`__)
* RF: Free the fMRI workflow from FSL (`#842 <https://github.com/nipreps/mriqc/pull/842>`__)
* CI: Fix up Circle builds (`#876 <https://github.com/nipreps/mriqc/pull/876>`__)
* CI: Update machine images on Circle (`#874 <https://github.com/nipreps/mriqc/pull/874>`__)

Older (unsupported) series
==========================
0.15.3 (September 18, 2020)
---------------------------
A bugfix release to re-enable setting of ``--omp-nthreads/--ants-nthreads``.

* FIX: ``omp_nthreads`` typo (`#846 <https://github.com/nipreps/mriqc/pull/846>`__)

0.15.2 (April 6, 2020)
----------------------
A bugfix release containing mostly maintenance actions and documentation
improvements. This version drops Python 3.5.
The core of MRIQC has adopted the config-module pattern from fMRIPrep.
With thanks to A. Erramuzpe, @justbennet, U. Tooley, and A. Huffman
for contributions.

* MAINT: revise style of all files (except for workflows) (`#839 <https://github.com/nipreps/mriqc/pull/839>`__)
* MAINT: Clear the clutter of warnings (`#838 <https://github.com/nipreps/mriqc/pull/838>`__)
* RF: Adopt config module pattern from *fMRIPrep* (`#837 <https://github.com/nipreps/mriqc/pull/837>`__)
* MAINT: Clear the clutter of warnings (`#838 <https://github.com/nipreps/mriqc/pull/838>`__)
* MAINT: Drop Python 3.5, simplify linting (`#833 <https://github.com/nipreps/mriqc/pull/833>`__)
* MAINT: Update to latest Ubuntu Xenial tag (`#814 <https://github.com/nipreps/mriqc/pull/814>`__)
* MAINT: Centralize all requirements and versions on ``setup.cfg`` (`#819 <https://github.com/nipreps/mriqc/pull/819>`__)
* MAINT: Use recent Python image to build packages in CircleCI (`#808 <https://github.com/nipreps/mriqc/pull/808>`__)
* DOC: Improve AQI (and other IQMs) and boxplot whiskers descriptions (`#816 <https://github.com/nipreps/mriqc/pull/816>`__)
* DOC: Refactor how documentation is built on CircleCI (`#818 <https://github.com/nipreps/mriqc/pull/818>`__)
* DOC: Corrected a couple of typos in ``--help`` text (`#809 <https://github.com/nipreps/mriqc/pull/809>`__)

0.15.1 (July 26, 2019)
----------------------
A maintenance patch release updating PyBIDS.

* FIX: ``FileNotFoundError`` when MELODIC (``--ica``) does not converge (`#800 <https://github.com/nipreps/mriqc/pull/800>`__) @oesteban
* MAINT: Migrate MRIQC to a ``setup.cfg`` style of installation (`#799 <https://github.com/nipreps/mriqc/pull/799>`__) @oesteban
* MAINT: Use PyBIDS 0.9.2+ via niworkflows PR (`#796 <https://github.com/nipreps/mriqc/pull/796>`__) @effigies

0.15.0 (April 5, 2019)
----------------------
A long overdue update, pinning updated versions of
`TemplateFlow <https://doi.org/10.5281/zenodo.2583289>`__ and
`Niworkflows <https://github.com/nipreps/niworkflows>`__.
With thanks to @garciadias for contributions.

* ENH: Revision of QI2 (`#606 <https://github.com/nipreps/mriqc/pull/606>`__) @oesteban
* FIX: Set matplotlib backend early (`#759 <https://github.com/nipreps/mriqc/pull/759>`__) @oesteban
* FIX: Niworkflows pin <0.5 (`#766 <https://github.com/nipreps/mriqc/pull/766>`__) @oesteban
* DOC: Update BIDS validation link. (`#764 <https://github.com/nipreps/mriqc/pull/764>`__) @garciadias
* DOC: Add data sharing agreement (`#765 <https://github.com/nipreps/mriqc/pull/765>`__) @oesteban
* FIX: Catch uncaught exception in WebAPI upload. (`#774 <https://github.com/nipreps/mriqc/pull/774>`__) @rwblair
* FIX/DOC: Append new line after dashes in ``mriqc_run`` help text (`#777 <https://github.com/nipreps/mriqc/pull/777>`__) @rwblair
* ENH: Use TemplateFlow and niworkflows-0.8.x (`#782 <https://github.com/nipreps/mriqc/pull/782>`__) @oesteban
* FIX: Correctly set WebAPI rating endpoint in BOLD reports. (`#785 <https://github.com/nipreps/mriqc/pull/785>`__) @oesteban
* FIX: Correctly process values of rating widget (`#787 <https://github.com/nipreps/mriqc/pull/787>`__) @oesteban

0.14.2 (August 20, 2018)
------------------------

* FIX: Preempt pandas resolving ``Path`` objects (`#746 <https://github.com/nipreps/mriqc/pull/746>`__) @oesteban
* FIX: Codacy issues (`#745 <https://github.com/nipreps/mriqc/pull/745>`__) @oesteban

0.14.1 (August 20, 2018)
------------------------

* FIX: Calculate relative path with sessions (`#742 <https://github.com/nipreps/mriqc/pull/742>`__) @oesteban
* ENH: Add a toggle button to rating widget (`#743 <https://github.com/nipreps/mriqc/pull/743>`__) @oesteban

0.14.0 (August 17, 2018)
------------------------

* ENH: New feedback widget (`#740 <https://github.com/nipreps/mriqc/pull/740>`__) @oesteban

0.13.1 (August 16, 2018)
------------------------

* [ENH,FIX] Updates to individual reports, fix table after rating (`#739 <https://github.com/nipreps/mriqc/pull/739>`__) @oesteban

0.13.0 (August 15, 2018)
------------------------

* MAINT: Overdue refactor (`#736 <https://github.com/nipreps/mriqc/pull/736>`__) @oesteban
  * FIX: Reorganize outputs (closes #396)
  * ENH: Memory usage - lessons learned with FMRIPREP (`#703 <https://github.com/nipreps/mriqc/pull/703>`__)
  * FIX: Cannot allocate memory (v 0.9.4) (closes #536)
  * FIX: Drop inoperative ``--report-dir`` flag (`#550 <https://github.com/nipreps/mriqc/pull/550>`__)
  * FIX: Drop misleading WARNING of the group-level execution (`#714 <https://github.com/nipreps/mriqc/pull/714>`__)
  * FIX: Expand usernames on input paths (`#721 <https://github.com/nipreps/mriqc/pull/721>`__)
  * MAINT: More robust naming of derivatives (related to #661)

* FIX: Do not fail with spurious 4th dimension on T1w (`#738 <https://github.com/nipreps/mriqc/pull/738>`__) @oesteban
* ENH: Move on to .tsv files (`#737 <https://github.com/nipreps/mriqc/pull/737>`__) @oesteban

0.12.1 (August 13, 2018)
------------------------

* FIX: ``BIDSLayout`` queries (`#735 <https://github.com/nipreps/mriqc/pull/735>`__)


0.12.0 (August 09, 2018)
------------------------

* FIX: Reduce tSNR memory requirements (`#712 <https://github.com/nipreps/mriqc/pull/712>`__)
* DOC: Fix typos in IQM documentation (`#725 <https://github.com/nipreps/mriqc/pull/725>`__)
* PIN: Update MRIQC WebAPI version (`#734 <https://github.com/nipreps/mriqc/pull/734>`__)
* BUG: Fix missing library in singularity images (`#733 <https://github.com/nipreps/mriqc/pull/733>`__)
* PIN: nipype 1.1.0, niworkflows (`#726 <https://github.com/nipreps/mriqc/pull/726>`__)

0.11.0 (June 05, 2018)
----------------------

* RF: Resume external nipype dependency (`#715 <https://github.com/nipreps/mriqc/pull/715>`__)

0.10.6 (May 29, 2018)
---------------------

* HOTFIX: Bug #659

0.10.5 (May 28, 2018)
---------------------

* ENH: Report feedback (`#659 <https://github.com/nipreps/mriqc/pull/659>`__)

0.10.4 (March 22, 2018)
-----------------------

* ENH: Various improvements to reports (`#708 <https://github.com/nipreps/mriqc/pull/708>`__)
* MAINT: Style revision (`#704 <https://github.com/nipreps/mriqc/pull/704>`__)
* PIN: pybids 0.5 (`#700 <https://github.com/nipreps/mriqc/pull/700>`__)
* ENH: Increase FAST memory limits (`#702 <https://github.com/nipreps/mriqc/pull/702>`__)

0.10.3 (February 26, 2018)
--------------------------

* ENH: Enable T2w metrics uploads (`#696 <https://github.com/nipreps/mriqc/pull/696>`__)
* PIN: Updating niworkflows (`#698 <https://github.com/nipreps/mriqc/pull/698>`__)
* DOC: Option ``-o`` is outdated for classifier (`#697 <https://github.com/nipreps/mriqc/pull/697>`__)

0.10.2 (February 15, 2018)
--------------------------

* ENH: Add warning about mounting relative paths (`#690 <https://github.com/nipreps/mriqc/pull/690>`__)
* FIX: Sanitize inputs (`#687 <https://github.com/nipreps/mriqc/pull/687>`__)
* DOC: Fix documentation to use ``--version`` instead of ``-v`` (`#688 <https://github.com/nipreps/mriqc/pull/688>`__)

0.10.1
------

* FIX: Fixed a bug in reading outputs of ``3dFWHMx`` (`#678 <https://github.com/nipreps/mriqc/pull/678>`__)

0.9.10
------

* FIX: Updated AFNI to 17.3.03. Resolves errors regarding opening display by ``3dSkullStrip`` (`#669 <https://github.com/nipreps/mriqc/pull/669>`__)

0.9.9
-----

* ENH: Update nipype to fix ``$DISPLAY`` problem of AFNI's ``3dSkullStrip``

0.9.8
-----
With thanks to Jan Varada (@jvarada) for the session/run filtering.

* ENH: Report recall in cross-validation (requested by reviewer) (`#633 <https://github.com/nipreps/mriqc/pull/633>`__)
* ENH: Hotfixes to 0.9.7 (`#635 <https://github.com/nipreps/mriqc/pull/635>`__)
* FIX: Implement filters for session, run and task of BIDS input (`#612 <https://github.com/nipreps/mriqc/pull/612>`__)

0.9.7
-----

* ENH: Clip outliers in FD and SPIKES group plots (`#593 <https://github.com/nipreps/mriqc/pull/593>`__)
* ENH: Second revision of the classifier (`#555 <https://github.com/nipreps/mriqc/pull/555>`__):
  * Set matplotlib plugin to `agg` in docker image
  * Migrate scalings to sklearn pipelining system
  * Add Satra's feature selection for RFC (with thanks to S. Ghosh for his suggestion)
  * Make model selection compatible with sklearn `Pipeline`
  * Multiclass classification
  * Add feature selection filter based on Sites prediction (requires pinning to development sklearn-0.19)
  * Add `RobustLeavePGroupsOut`, replace `RobustGridSearchCV` with the standard `GridSearchCV` of sklearn.
  * Choice between `RepeatedStratifiedKFold` and `RobustLeavePGroupsOut` in `mriqc_clf`
  * Write cross-validation results to an `.npz` file.
* ENH: First revision of the classifier (`#553 <https://github.com/nipreps/mriqc/pull/553>`__):
  * Add the possibility of changing the scorer function.
  * Unifize labels for raters in data tables (to `rater_1`)
  * Add the possibility of setting a custom decision threshold
  * Write the probabilities in the prediction file
  * Revised `mriqc_clf` processing flow
  * Revised labels file for ds030.
  * Add IQMs for ABIDE and DS030 calculated with MRIQC 0.9.6.
* ANNOUNCEMENT: Dropped support for Python<-3.4
* WARNING (`#596 <https://github.com/nipreps/mriqc/pull/596>`__):
  We have changed the default number of threads for ANTs. Using parallelism with ANTs
  causes numerical instability on the calculated measures. The most sensitive metrics to this
  problem are the kurtosis calculations on the intensities of regions and qi_2.

0.9.6
-----

* ENH: Finished setting up `MRIQC Web API <https://mriqc.nimh.nih.gov>`_
* ENH: Better error message when --participant_label is set (`#542 <https://github.com/nipreps/mriqc/pull/542>`__)
* FIX: Allow --load-classifier option to be empty in mriqc_clf (`#544 <https://github.com/nipreps/mriqc/pull/544>`__)
* FIX: Borked bias estimation derived from Conform (`#541 <https://github.com/nipreps/mriqc/pull/541>`__)
* ENH: Test against web API 0.3.2 (`#540 <https://github.com/nipreps/mriqc/pull/540>`__)
* ENH: Change the default Web API address (`#539 <https://github.com/nipreps/mriqc/pull/539>`__)
* ENH: MRIQCWebAPI: hash fields that may have PI (`#538 <https://github.com/nipreps/mriqc/pull/538>`__)
* ENH: Added token authorization to MRIQCWebAPI client (`#535 <https://github.com/nipreps/mriqc/pull/535>`__)
* FIX: Do not mask and antsAffineInitializer twice (`#534 <https://github.com/nipreps/mriqc/pull/534>`__)
* FIX: Datasets where air (hat) mask is empty (`#533 <https://github.com/nipreps/mriqc/pull/533>`__)
* ENH: Integration testing for MRIQCWebAPI (`#520 <https://github.com/nipreps/mriqc/pull/520>`__)
* ENH: Use AFNI to calculate gcor (`#531 <https://github.com/nipreps/mriqc/pull/531>`__)
* ENH: Refactor derivatives (`#530 <https://github.com/nipreps/mriqc/pull/530>`__)
* ENH: New bold-IQM: dummy_trs (non-stady state volumes) (`#524 <https://github.com/nipreps/mriqc/pull/524>`__)
* FIX: Order of BIDS components in IQMs CSV table (`#525 <https://github.com/nipreps/mriqc/pull/525>`__)
* ENH: Improved logging of mriqc_run (`#526 <https://github.com/nipreps/mriqc/pull/526>`__)

0.9.5
-----

* ENH: Refactored structural metrics calculation (`#513 <https://github.com/nipreps/mriqc/pull/513>`__)
* ENH: Calculate rotation mask (`#515 <https://github.com/nipreps/mriqc/pull/515>`__)
* ENH: Intensity harmonization in the anatomical workflow (`#510 <https://github.com/nipreps/mriqc/pull/510>`__)
* ENH: Set N4BiasFieldCorrection number of threads (`#506 <https://github.com/nipreps/mriqc/pull/506>`__)
* ENH: Convert FWHM in pixel units (`#503 <https://github.com/nipreps/mriqc/pull/503>`__)
* ENH: Add MRIQC client for feature crowdsourcing (`#464 <https://github.com/nipreps/mriqc/pull/464>`__)
* DOC: Fix functional feature labels in documentation (docs_only) (`#507 <https://github.com/nipreps/mriqc/pull/507>`__)
* FIX: New implementation for the rPVE feature (normalization, left-tail values) (`#505 <https://github.com/nipreps/mriqc/pull/505>`__)
* ENH: Parse BIDS selectors (run, task, etc.), improve CLI (`#504 <https://github.com/nipreps/mriqc/pull/504>`__)


0.9.4
-----

* ANNOUNCEMENT: Dropped Python 2 support
* ENH: Use versioneer to handle versions (`#500 <https://github.com/nipreps/mriqc/pull/500>`__)
* ENH: Speed up spatial normalization (`#495 <https://github.com/nipreps/mriqc/pull/495>`__)
* ENH: Resampling of hat mask and TPMs with linear interp (`#498 <https://github.com/nipreps/mriqc/pull/498>`__)
* TST: Build documentation in CircleCI (`#484 <https://github.com/nipreps/mriqc/pull/484>`__)
* ENH: Use full-resolution T1w images from ABIDE (`#486 <https://github.com/nipreps/mriqc/pull/486>`__)
* TST: Parallelize tests (`#493 <https://github.com/nipreps/mriqc/pull/493>`__)
* TST: Binding /etc/localtime stopped working in docker 1.9.1 (`#492 <https://github.com/nipreps/mriqc/pull/492>`__)
* TST: Downgrade docker to 1.9.1 in circle (build_only) (`#491 <https://github.com/nipreps/mriqc/pull/491>`__)
* TST: Check for changes in intermediate nifti files (`#485 <https://github.com/nipreps/mriqc/pull/485>`__)
* FIX: Erroneous flag --n_proc in CircleCI (`#490 <https://github.com/nipreps/mriqc/pull/490>`__)
* ENH: Add build_only tag to circle builds (`#488 <https://github.com/nipreps/mriqc/pull/488>`__)
* ENH: Update Dockerfile (`#482 <https://github.com/nipreps/mriqc/pull/482>`__)
* FIX: Ignore --profile flag with Linear plugin (`#483 <https://github.com/nipreps/mriqc/pull/483>`__)
* DOC: Deep revision of the documentation (`#479 <https://github.com/nipreps/mriqc/pull/479>`__)
* ENH: Minor improvements: SpatialNormalization and segmentation (`#472 <https://github.com/nipreps/mriqc/pull/472>`__)
* ENH: Fixed typo for neurodebian install via apt-get (`#478 <https://github.com/nipreps/mriqc/pull/478>`__)
* ENH: Updating fs2gif script (`#465 <https://github.com/nipreps/mriqc/pull/465>`__)
* ENH: RF: Use niworkflows.interface.SimpleInterface (`#468 <https://github.com/nipreps/mriqc/pull/468>`__)
* ENH: Add reproducibility of metrics tracking (`#466 <https://github.com/nipreps/mriqc/pull/466>`__)

Release 0.9.3
-------------

* ENH: Reafactor of the Dockerfile to improve transparency, reduce size, and enable injecting code in Singularity (`#457 <https://github.com/nipreps/mriqc/pull/457>`__)
* ENH: Make more the memory consumption estimates of each processing step more conservative to improve robustness (`#456 <https://github.com/nipreps/mriqc/pull/456>`__)
* FIX: Minor documentation cleanups (`#461 <https://github.com/nipreps/mriqc/pull/461>`__)

Release 0.9.2
-------------

* ENH: Optional ICA reports for identifying spatiotemporal artifacts (`#412 <https://github.com/nipreps/mriqc/pull/412>`__)
* ENH: Add --profile flag (`#435 <https://github.com/nipreps/mriqc/pull/435>`__)
* ENH: Crashfiles are saved in plain text to improve portability (`#434 <https://github.com/nipreps/mriqc/pull/434>`__)
* FIX: Fixes EPI mask erosion (`#442 <https://github.com/nipreps/mriqc/pull/442>`__)
* ENH: Make FSL and AFNI motion correction more comparable by using the same scheme for defining the reference image (`#444 <https://github.com/nipreps/mriqc/pull/444>`__)
* FIX: Temporarily disabling T1w quality classifier until it can be retrained on new measures (`#447 <https://github.com/nipreps/mriqc/pull/447>`__)

Release 0.9.1
-------------

* ENH: Add mriqc version and input image hash to IQMs json file (`#432 <https://github.com/nipreps/mriqc/pull/432>`__)
* FIX: Affine and warp transforms are now applied in the correct order (`#431 <https://github.com/nipreps/mriqc/pull/431>`__)

Release 0.9.0-2
---------------

* ENH: Revise Docker paths (`#429 <https://github.com/nipreps/mriqc/pull/429>`__)
* FIX: Greedy participant selection (`#426 <https://github.com/nipreps/mriqc/pull/426>`__)
* FIX: Pin pybids to new version 0.1.0 (`#427 <https://github.com/nipreps/mriqc/pull/427>`__)
* FIX: Amends sloppy PR #425 (`#428 <https://github.com/nipreps/mriqc/pull/428>`__)

Release 0.9.0-1
---------------

* FIX: BOLD reports clipped IQMs after spikes_num (`#425 <https://github.com/nipreps/mriqc/pull/425>`__)
* FIX: Unicode error writing group reports (`#424 <https://github.com/nipreps/mriqc/pull/424>`__)
* FIX: Respect Nifi header in fMRI conform node (`#415 <https://github.com/nipreps/mriqc/pull/415>`__)
* DOC: Deep revision of documentation (#411, #416)
* ENH: Added sphinx extension to plot workflow graphs (`#411 <https://github.com/nipreps/mriqc/pull/411>`__)
* FIX: Removed repeated bias correction on anatomical workflows (`#410 <https://github.com/nipreps/mriqc/pull/410>`__)
* FIX: Race condition in bold workflow when using shared workdir (`#409 <https://github.com/nipreps/mriqc/pull/409>`__)
* FIX: Tests (#408, #407, #405)
* FIX: Remove CDN for group level reports (`#406 <https://github.com/nipreps/mriqc/pull/406>`__)
* FIX: Unused connection, matplotlib segfault (#403, #402)
* ENH: Skip SpikeFFT detector by default (`#400 <https://github.com/nipreps/mriqc/pull/400>`__)
* ENH: Use float32 (`#399 <https://github.com/nipreps/mriqc/pull/399>`__)
* ENH: Spike finder performance improvoments (`#398 <https://github.com/nipreps/mriqc/pull/398>`__)
* ENH: Basic T2w workflow (`#394 <https://github.com/nipreps/mriqc/pull/394>`__)
* ENH: Re-enable 3dvolreg (`#390 <https://github.com/nipreps/mriqc/pull/390>`__)
* ENH: Add T1w classifier (`#389 <https://github.com/nipreps/mriqc/pull/389>`__)

Release 0.9.0-0
---------------

* FIX: Remove non-repeatable step from pipeline (`#369 <https://github.com/nipreps/mriqc/pull/369>`__)
* ENH: Improve group level command line, with more informative output when no IQMs are found for a modality (`#372 <https://github.com/nipreps/mriqc/pull/372>`__)
* ENH: Make group reports self-contained (`#333 <https://github.com/nipreps/mriqc/pull/333>`__)
* FIX: New mosaics, based on old ones (#361, #360, #334)
* FIX: Require numpy>=1.12 to avoid casting problems (`#356 <https://github.com/nipreps/mriqc/pull/356>`__)
* FIX: Add support for acq and rec tags of BIDS (`#346 <https://github.com/nipreps/mriqc/pull/346>`__)
* DOC: Documentation updates (`#350 <https://github.com/nipreps/mriqc/pull/350>`__)
* FIX: pybids compatibility "No scans were found" (#340, #347, #342)
* ENH: Rewrite PYTHONPATH in docker/singularity images (`#345 <https://github.com/nipreps/mriqc/pull/345>`__)
* ENH: Move metadata onto the bottom of the individual reports (`#332 <https://github.com/nipreps/mriqc/pull/332>`__)
* ENH: Don't include MNI registration report unlesS --verbose-reports is used (`#362 <https://github.com/nipreps/mriqc/pull/362>`__)


Release 0.8.9
-------------

* ENH: Added registration svg panel to reports (`#297 <https://github.com/nipreps/mriqc/pull/297>`__)


Release 0.8.8
-------------

* FIX: Bug translating int16 to uint8 in conform image.
* FIX: Error in ConformImage interface (`#297 <https://github.com/nipreps/mriqc/pull/297>`__)
* ENH: Replace BBR by ANTs (#295, #296)
* FIX: Singularity: user-environment leaking into container (`#293 <https://github.com/nipreps/mriqc/pull/293>`__)
* ENH: Report failed cases in group report (`#291 <https://github.com/nipreps/mriqc/pull/291>`__)
* FIX: Brighter anatomical --verbose-reports (`#290 <https://github.com/nipreps/mriqc/pull/290>`__)
* FIX: X-flip in the mosaics (`#289 <https://github.com/nipreps/mriqc/pull/289>`__)
* ENH: Show metadata in the individual report (`#288 <https://github.com/nipreps/mriqc/pull/288>`__)
* ENH: Label in the cutoff threshold - fmriplot (`#287 <https://github.com/nipreps/mriqc/pull/287>`__)
* ENH: PyBIDS (`#286 <https://github.com/nipreps/mriqc/pull/286>`__)
* ENH: Simplify tests (`#284 <https://github.com/nipreps/mriqc/pull/284>`__)
* FIX: MRIQC crashed generating csv files (`#283 <https://github.com/nipreps/mriqc/pull/283>`__)
* FIX: Bug in setup.py (`#281 <https://github.com/nipreps/mriqc/pull/281>`__)
* ENH: Makefile (`#280 <https://github.com/nipreps/mriqc/pull/280>`__)
* FIX: Revision of IQMs (#266, #272, #279)
* ENH: Deprecation of --nthreads, new flags (`#260 <https://github.com/nipreps/mriqc/pull/260>`__)
* ENH: Improvements on plots rendering (#254, #257, #258, #267, #268, #269, #270)
* ENH: FFT detection of spikes (#253, #272)
* FIX: Labels and links of samples in group plots (`#249 <https://github.com/nipreps/mriqc/pull/249>`__)
* ENH: Units in group plots (`#242 <https://github.com/nipreps/mriqc/pull/242>`__)
* FIX: More reliable group level (`#238 <https://github.com/nipreps/mriqc/pull/238>`__)
* ENH: Add --verbose-reports for fMRI (`#236 <https://github.com/nipreps/mriqc/pull/236>`__)
* ENH: Migrate functional reports to html (`#232 <https://github.com/nipreps/mriqc/pull/232>`__)
* ENH: Add 0.2 FD cutoff line (`#231 <https://github.com/nipreps/mriqc/pull/231>`__)
* ENH: Add AFNI's outlier count to carpet plot confound charts (`#230 <https://github.com/nipreps/mriqc/pull/230>`__)

Release 0.8.7
-------------

* ENH: Anatomical Group reports in html (`#227 <https://github.com/nipreps/mriqc/pull/227>`__)
* ENH: Add kurtosis to summary statistics (`#224 <https://github.com/nipreps/mriqc/pull/224>`__)
* ENH: New report layout for fMRI, added carpetplot (`#198 <https://github.com/nipreps/mriqc/pull/198>`__)
* ENH: Anatomical workflow refactor (`#219 <https://github.com/nipreps/mriqc/pull/219>`__).

Release 0.8.6
-------------

* [FIX, CRITICAL] Do not chmod in Docker internal scripts
* FIX: Error creating derivatives folder
* ENH: Moved MNI spatial normalization to NIworkflows, and made robust.
* ENH: De-coupled participant and group (reports) levels
* ENH: Use new FD and DVARs calculations from nipype (`#172 <https://github.com/nipreps/mriqc/pull/172>`__)
* ENH: Started with python3 compatibility
* ENH: Added new M2WM measure #158
* FIX: QI2 is skipped if background intensity is not appropriate (`#147 <https://github.com/nipreps/mriqc/pull/147>`__)

Release 0.8.5
-------------

* FIX: Error inverting the T1w-to-MNI warping (`#146 <https://github.com/nipreps/mriqc/pull/146>`__)
* FIX: TypeError computing DVARS (`#145 <https://github.com/nipreps/mriqc/pull/145>`__)
* ENH: Plot figure of fitted background chi for QI2 (`#143 <https://github.com/nipreps/mriqc/pull/143>`__)
* ENH: Move skull-stripping and reorient to NIworkflows (`#142 <https://github.com/nipreps/mriqc/pull/142>`__)
* FIX: mriqc crashes if no anatomical scans are found (`#141 <https://github.com/nipreps/mriqc/pull/141>`__)
* DOC: Added acknowledgments to CPAC team members (`#134 <https://github.com/nipreps/mriqc/pull/134>`__)
* ENH: Use absolute imports (`#133 <https://github.com/nipreps/mriqc/pull/133>`__)
* FIX: VisibleDeprecationWarning (`#132 <https://github.com/nipreps/mriqc/pull/132>`__)
* ENH: Provide full FD/DVARS files (`#128 <https://github.com/nipreps/mriqc/pull/128>`__)
* ENH: Use MCFLIRT to compute motion parameters. AFNI's 3dvolreg now is optional (`#121 <https://github.com/nipreps/mriqc/pull/121>`__)
* FIX: BIDS trees with anatomical images with different acquisition tokens (`#116 <https://github.com/nipreps/mriqc/pull/116>`__)
* FIX: BIDS trees with anatomical images with several runs (`#112 <https://github.com/nipreps/mriqc/pull/112>`__)
* ENH: Options for ANTs normalization: reduced test times (`#124 <https://github.com/nipreps/mriqc/pull/124>`__),
  and updated options (`#115 <https://github.com/nipreps/mriqc/pull/115>`__)

Release 0.8.4
-------------

* ENH: PDF reports now use RST templates and jinja2 (`#109 <https://github.com/nipreps/mriqc/pull/109>`__)
* FIX: Single-session-multiple-run anatomical files were not correctly located (`#112 <https://github.com/nipreps/mriqc/pull/112>`__)

Release 0.8.3
-------------

* DOC: Added examples of the PDF reports (`#107 <https://github.com/nipreps/mriqc/pull/107>`__)
* FIX: Fixed problems with Python 3 when generating reports.

Release 0.8.2
-------------

* ENH: Python 3 compatibility (`#99 <https://github.com/nipreps/mriqc/pull/99>`__)
* ENH: Add JSON settings file for ANTS (`#95 <https://github.com/nipreps/mriqc/pull/95>`__)
* ENH: Generate reports automatically if mriqc is run without the -S flag (`#93 <https://github.com/nipreps/mriqc/pull/93>`__)
* FIX: Revised implementation of QI2 measure (`#90 <https://github.com/nipreps/mriqc/pull/90>`__)
* AGAVE: Fixed docker image for agave (`#89 <https://github.com/nipreps/mriqc/pull/89>`__)
* FIX: Problem when generating the air mask with dipy installed (`#88 <https://github.com/nipreps/mriqc/pull/88>`__)
* ENH: One-session-one-run execution mode (`#85 <https://github.com/nipreps/mriqc/pull/85>`__)
* AGAVE: Added an agave app description generator (`#84 <https://github.com/nipreps/mriqc/pull/84>`__)

Release 0.3.0
-------------

* ENH: Updated CircleCI and Docker to use the version 2.1.0 of ANTs
  compiled by their developers.
* ENH: New anatomical workflows to compute the air mask (`#56 <https://github.com/nipreps/mriqc/pull/56>`__)

Release 0.1.0
-------------

* FIX: #55
* ENH: Added rotation of output csv files if they exist

Release 0.0.2
-------------

* ENH: Completed migration from QAP
* ENH: Integration with ReadTheDocs
* ENH: Submission to PyPi

Release 0.0.1
-------------

* Basic mriqc functionality


================================================
FILE: Dockerfile
================================================
# MRIQC Docker Container Image distribution
#
# MIT License
#
# Copyright (c) 2021 The NiPreps Developers
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

# Ubuntu 22.04 LTS - Jammy
ARG BASE_IMAGE=ubuntu:jammy-20240125

#
# Build wheel
#
FROM python:slim AS src
RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive \
    apt-get install -y --no-install-recommends git
ARG VERSION
ENV SETUPTOOLS_SCM_PRETEND_VERSION=$VERSION

RUN python -m pip install -U pip build
COPY . /src
RUN python -m build /src

# Utilities for downloading packages
FROM ${BASE_IMAGE} as downloader
# Bump the date to current to refresh curl/certificates/etc
RUN echo "2024.03.18"
RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive \
    apt-get install -y --no-install-recommends \
                    binutils \
                    bzip2 \
                    ca-certificates \
                    curl \
                    unzip && \
    apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*


# AFNI
FROM downloader as afni
# Bump the date to current to update AFNI
RUN echo "2024.03.18"
RUN mkdir -p /opt/afni-latest \
    && curl -fsSL --retry 5 https://afni.nimh.nih.gov/pub/dist/tgz/linux_openmp_64.tgz \
    | tar -xz -C /opt/afni-latest --strip-components 1 \
    --exclude "linux_openmp_64/*.gz" \
    --exclude "linux_openmp_64/funstuff" \
    --exclude "linux_openmp_64/shiny" \
    --exclude "linux_openmp_64/afnipy" \
    --exclude "linux_openmp_64/lib/RetroTS" \
    --exclude "linux_openmp_64/lib_RetroTS" \
    --exclude "linux_openmp_64/meica.libs" \
    # Keep only what we use
    && find /opt/afni-latest -type f -not \( \
            -name "3dAutomask" \
        -or -name "3dcalc" \
        -or -name "3dFWHMx" \
        -or -name "3dinfo" \
        -or -name "3dmaskave" \
        -or -name "3dSkullStrip" \
        -or -name "3dTnorm" \
        -or -name "3dToutcount" \
        -or -name "3dTqual" \
        -or -name "3dTshift" \
        -or -name "3dTstat" \
        -or -name "3dUnifize" \
        -or -name "3dvolreg" \
        -or -name "@compute_gcor" \
        -or -name "afni" \
       \) -delete

# Use Ubuntu 20.04 LTS
FROM nipreps/miniconda:py39_2403.0

ARG DEBIAN_FRONTEND=noninteractive
ENV LD_LIBRARY_PATH="/usr/lib/x86_64-linux-gnu:${CONDA_PATH}/lib"
ENV CONDA_PATH="/opt/conda"

# Configure PPAs for libpng12 and libxp6
RUN GNUPGHOME=/tmp gpg --keyserver hkps://keyserver.ubuntu.com --no-default-keyring --keyring /usr/share/keyrings/linuxuprising.gpg --recv 0xEA8CACC073C3DB2A \
    && GNUPGHOME=/tmp gpg --keyserver hkps://keyserver.ubuntu.com --no-default-keyring --keyring /usr/share/keyrings/zeehio.gpg --recv 0xA1301338A3A48C4A \
    && echo "deb [signed-by=/usr/share/keyrings/linuxuprising.gpg] https://ppa.launchpadcontent.net/linuxuprising/libpng12/ubuntu jammy main" > /etc/apt/sources.list.d/linuxuprising.list \
    && echo "deb [signed-by=/usr/share/keyrings/zeehio.gpg] https://ppa.launchpadcontent.net/zeehio/libxp/ubuntu jammy main" > /etc/apt/sources.list.d/zeehio.list

# Dependencies for AFNI; requires a discontinued multiarch-support package from bionic (18.04)
RUN apt-get update -qq \
    && apt-get install -y -q --no-install-recommends \
           ed \
           gsl-bin \
           libglib2.0-0 \
           libglu1-mesa-dev \
           libglw1-mesa \
           libgomp1 \
           libjpeg62 \
           libpng12-0 \
           libxm4 \
           libxp6 \
           netpbm \
           tcsh \
           xfonts-base \
           xvfb \
    && curl -sSL --retry 5 -o /tmp/multiarch.deb http://archive.ubuntu.com/ubuntu/pool/main/g/glibc/multiarch-support_2.27-3ubuntu1.5_amd64.deb \
    && dpkg -i /tmp/multiarch.deb \
    && rm /tmp/multiarch.deb \
    && apt-get install -f \
    && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
    && gsl2_path="$(find / -name 'libgsl.so.19' || printf '')" \
    && if [ -n "$gsl2_path" ]; then \
         ln -sfv "$gsl2_path" "$(dirname $gsl2_path)/libgsl.so.0"; \
    fi \
    && ldconfig

# Install AFNI
ENV AFNI_DIR="/opt/afni"
COPY --from=afni /opt/afni-latest ${AFNI_DIR}
ENV PATH="${AFNI_DIR}:$PATH" \
    AFNI_IMSAVE_WARNINGS="NO" \
    AFNI_MODELPATH="${AFNI_DIR}/models" \
    AFNI_TTATLAS_DATASET="${AFNI_DIR}/atlases" \
    AFNI_PLUGINPATH="${AFNI_DIR}/plugins"

# Install AFNI's dependencies
RUN micromamba install -n base -c conda-forge "ants=2.5" \
            && sync \
	    && micromamba clean -afy; sync \
	    && ldconfig

# Unless otherwise specified each process should only use one thread - nipype
# will handle parallelization
ENV MKL_NUM_THREADS=1 \
    OMP_NUM_THREADS=1 \
    NUMEXPR_MAX_THREADS=1

COPY --from=freesurfer/synthstrip@sha256:f19578e5f033f2c707fa66efc8b3e11440569facb46e904b45fd52f1a12beb8b /freesurfer/models/synthstrip.1.pt /opt/freesurfer/models/synthstrip.1.pt

ENV FREESURFER_HOME=/opt/freesurfer

RUN apt update && apt install --no-install-recommends -y libtiff5 libpng16-16

COPY --from=mrtrix3/mrtrix3:3.0.4 /opt/mrtrix3/bin/dwidenoise /usr/local/bin
COPY --from=mrtrix3/mrtrix3:3.0.4 /opt/mrtrix3/lib/libmrtrix.so /usr/local/lib

# Container Sentinel
ENV IS_DOCKER_8395080871=1

# Create a shared $HOME directory
RUN useradd -m -s /bin/bash -G users mriqc
WORKDIR /home/mriqc
ENV HOME="/home/mriqc"

# Pacify datalad
RUN git config --global user.name "NiPreps - MRIQC" \
    && git config --global user.email "nipreps@gmail.com"

RUN micromamba shell init -s bash
ENV PATH="${CONDA_PATH}/bin:$PATH" \
    CPATH="${CONDA_PATH}/include:$CPATH" \
    LD_LIBRARY_PATH="${CONDA_PATH}/lib:$LD_LIBRARY_PATH"

# Refresh linked libraries
RUN echo "${CONDA_PATH}/lib" > /etc/ld.so.conf.d/conda.conf \
    && ldconfig
# Installing dev requirements (packages that are not in pypi)
WORKDIR /src/
# Precaching atlases
RUN python -c "from templateflow import api as tfapi; \
	       tfapi.get('MNI152NLin2009cAsym', resolution=[1, 2], suffix=['T1w', 'T2w'], desc=None); \
	       tfapi.get('MNI152NLin2009cAsym', resolution=[1, 2], suffix='mask',\
			 desc=['brain', 'head']); \
	       tfapi.get('MNI152NLin2009cAsym', resolution=1, suffix='dseg', desc='carpet'); \
	       tfapi.get('MNI152NLin2009cAsym', resolution=1, suffix='probseg',\
			 label=['CSF', 'GM', 'WM']);\
	       tfapi.get('MNI152NLin2009cAsym', resolution=[1, 2], suffix='boldref')"

# Installing MRIQC
COPY --from=src /src/dist/*.whl .
RUN pip install --no-cache-dir $( ls *.whl )[container,rodents,test]

RUN find $HOME -type d -exec chmod go=u {} + && \
    find $HOME -type f -exec chmod go=u {} + && \
    rm -rf $HOME/.npm $HOME/.conda $HOME/.empty

# Best practices
RUN ldconfig

# Update version
RUN export VERSION=$(python -m mriqc --version | awk '{print $NF}') \
    && echo "VERSION=$VERSION" >> /etc/environment

WORKDIR /tmp/

# Run mriqc by default
ENTRYPOINT ["/opt/conda/bin/mriqc"]
ARG BUILD_DATE
ARG VCS_REF
LABEL org.label-schema.build-date=$BUILD_DATE \
      org.label-schema.name="MRIQC" \
      org.label-schema.description="MRIQC - Automated Quality Control and visual reports for Quality Assessment of structural (T1w, T2w) and functional MRI of the brain" \
      org.label-schema.url="https://mriqc.readthedocs.io" \
      org.label-schema.vcs-ref=$VCS_REF \
      org.label-schema.vcs-url="https://github.com/nipreps/mriqc" \
      org.label-schema.version=$VERSION \
      org.label-schema.schema-version="1.0"


================================================
FILE: Dockerfile_devel
================================================
FROM nipreps/mriqc:latest
COPY . /src/mriqc
ARG VERSION
RUN export SETUPTOOLS_SCM_PRETEND_VERSION=$VERSION && pip install -e /src/mriqc[all]


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright 2020 The NiPreps Developers

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.



================================================
FILE: MANIFEST.in
================================================
#documentation
recursive-exclude .circleci/ *
recursive-exclude .github/ *
recursive-exclude .git/ *
recursive-exclude .maint/ *
recursive-exclude docker/ *
recursive-exclude docs/ *
recursive-exclude test/ *

exclude .*
exclude Dockerfile
exclude Dockerfile_devel
exclude Makefile

#data
recursive-include mriqc/data *


================================================
FILE: Makefile
================================================
# Basic actions

TEST_PATH = ./
MRIQC_VERSION = latest


.PHONY: clean-pyc
clean-pyc:
		find . -name '__pycache__' -type d -exec rm -r {} +
		find . -name '*.pyc' -exec rm --force {} +
		find . -name '*.pyo' -exec rm --force {} +
		find . -name '*~' -exec rm --force  {} +

.PHONY: clean-build
clean-build:
		rm --force --recursive build/
		rm --force --recursive dist/
		rm --force --recursive *.egg-info
		rm --force --recursive src/

.PHONY: tag
tag:
		git tag -a $(VERSION) -m "Version ${VERSION}"
		git push origin $(VERSION)
		git push upstream $(VERSION)

lint:
		pylint ./mriqc/

.PHONY: test
test: clean-pyc
		py.test --ignore=src/ --verbose $(TEST_PATH)

dist: clean-build clean-pyc
		python setup.py sdist

.PHONY: docker
docker:
		docker build -t nipreps/mriqc:$(MRIQC_VERSION) \
			--build-arg BUILD_DATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \
			--build-arg VCS_REF=`git rev-parse --short HEAD` \
			--build-arg VERSION=`python setup.py --version` .

.PHONY: release
release: clean-build tag docker
		python setup.py sdist
		twine upload dist/*

singularity: docker
	mkdir -p build/singularity
	docker run --privileged -ti --rm  \
    	-v /var/run/docker.sock:/var/run/docker.sock \
    	-v $(shell pwd)/build/singularity:/output \
    	singularityware/docker2singularity \
    	nipreps/mriqc:$(MRIQC_VERSION)



================================================
FILE: README.rst
================================================
mriqc: image quality metrics for quality assessment of MRI
==========================================================

|DOI| |Zenodo| |Package| |Pythons| |DevStatus| |PackageBuild| |License| |Documentation| |CircleCI| |EOSS|

MRIQC extracts no-reference IQMs (image quality metrics) from
structural (T1w and T2w), functional and diffusion MRI (magnetic resonance imaging)
data.

MRIQC is an open-source project, developed under the following
software engineering principles:

#. **Modularity and integrability**: MRIQC implements a
   `nipype <https://nipype.readthedocs.io>`_ workflow to integrate modular
   sub-workflows that rely upon third party software toolboxes such as
   ANTs and AFNI.

#. **Minimal preprocessing**: the MRIQC workflows should be as minimal
   as possible to estimate the IQMs on the original data or their minimally
   processed derivatives.

#. **Interoperability and standards**: MRIQC follows the the `brain imaging data structure
   (BIDS) <https://bids.neuroimaging.io>`_, and it adopts the `BIDS-App
   <https://bids-apps.neuroimaging.io>`_ standard.

#. **Reliability and robustness**: the software undergoes frequent vetting sprints
   by testing its robustness against data variability (acquisition parameters,
   physiological differences, etc.) using images from `OpenfMRI <https://openfmri.org>`_.
   Its reliability is permanently checked and maintained with
   `CircleCI <https://circleci.com/gh/nipreps/mriqc>`_.

Citation
--------
.. topic:: **When using MRIQC, please include the following citation:**

    Esteban O, Birman D, Schaer M, Koyejo OO, Poldrack RA, Gorgolewski KJ;
    *MRIQC: Advancing the Automatic Prediction of Image Quality in MRI from Unseen Sites*;
    PLOS ONE 12(9):e0184661; doi:`10.1371/journal.pone.0184661 <https://doi.org/10.1371/journal.pone.0184661>`_.

Support and communication
-------------------------
The documentation of this project is found here: https://mriqc.readthedocs.io/.

Users can get help using the `mriqc-users google group <https://groups.google.com/forum/#!forum/mriqc-users>`_.

All bugs, concerns and enhancement requests for this software can be submitted here:
https://github.com/nipreps/mriqc/issues.

Development
-----------
A local development build based on the latest docker build of MRIQC can be built with this command run from 
the root of this repository::

    docker build -f Dockerfile_devel -t mriqc_devel .

To test changes the local source code will need to be mounted into the development container::

    docker run --rm -v .:/src/mriqc mriqc_devel

New Python dependencies can be added in ``pyproject.toml`` under ``dependencies``.
Any time a dependency is changed or added there the docker image will need to be rebuilt
using the above ``docker build`` command.

License information
-------------------
*MRIQC* adheres to the
`general licensing guidelines <https://www.nipreps.org/community/licensing/>`__
of the *NiPreps framework*.

*MRIQC* originally derives from, and hence is heavily influenced by, the
`PCP Quality Assessment Protocol
<http://preprocessed-connectomes-project.org/quality-assessment-protocol/>`__.
Please check the ``NOTICE`` file for further information.

License
~~~~~~~
Copyright (c) 2021, the *NiPreps* Developers.

As of the 21.0.x pre-release and release series, *MRIQC* is
licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
`http://www.apache.org/licenses/LICENSE-2.0
<http://www.apache.org/licenses/LICENSE-2.0>`__.

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Acknowledgements
----------------
This work is steered and maintained by the `NiPreps Community <https://www.nipreps.org>`__.
The development of this resource was supported by
the Laura and John Arnold Foundation (RAP and KJG),
the NIBIB (R01EB020740, SSG; 1P41EB019936-01A1SSG, YOH),
the NIMH (RF1MH121867, RAP, OE; R24MH114705 and R24MH117179, RAP; 1RF1MH121885 SSG),
NINDS (U01NS103780, RAP), and NSF (CRCNS 1912266, YOH).
OE acknowledges financial support from the SNSF Ambizione project
“*Uncovering the interplay of structure, function, and dynamics of
brain connectivity using MRI*” (grant number
`PZ00P2_185872 <http://p3.snf.ch/Project-185872>`__).

.. topic:: **Thanks**

    * The QAP developers (C. Craddock, S. Giavasis, D. Clark, Z. Shezhad, and J.
      Pellman) for the initial base of code which MRIQC was forked from.
    * W Triplett and CA Moodie for their initial contributions with bugfixes and documentation, and
    * J Varada for his contributions on the source code.


.. |DOI| image:: https://img.shields.io/badge/doi-10.1371%2Fjournal.pone.0184661-blue.svg
   :target: https://doi.org/10.1371/journal.pone.0184661
.. |Zenodo| image:: https://zenodo.org/badge/DOI/10.5281/zenodo.2630889.svg
   :target: https://doi.org/10.5281/zenodo.2630889
.. |Package| image:: https://img.shields.io/pypi/v/mriqc.svg
   :target: https://pypi.python.org/pypi/mriqc/
.. |Pythons| image:: https://img.shields.io/pypi/pyversions/mriqc.svg
   :target: https://pypi.python.org/pypi/mriqc/
.. |DevStatus| image:: https://img.shields.io/pypi/status/mriqc.svg
   :target: https://pypi.python.org/pypi/mriqc/
.. |PackageBuild| image:: https://github.com/nipreps/mriqc/actions/workflows/pythonpackage.yml/badge.svg
   :target: https://github.com/nipreps/mriqc/actions/workflows/pythonpackage.yml
.. |License| image:: https://img.shields.io/pypi/l/mriqc.svg
   :target: https://pypi.python.org/pypi/mriqc/
.. |Documentation| image:: https://readthedocs.org/projects/mriqc/badge/?version=latest
   :target: http://mriqc.readthedocs.io/en/latest/?badge=latest
.. |CircleCI| image:: https://circleci.com/gh/nipreps/mriqc/tree/master.svg?style=shield
   :target: https://circleci.com/gh/nipreps/mriqc/tree/master
.. |EOSS| image:: https://chanzuckerberg.github.io/open-science/badges/CZI-EOSS.svg
  :target: https://czi.co/EOSS
  :alt: CZI's Essential Open Source Software for Science


================================================
FILE: docker/files/neurodebian.gpg
================================================
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1

mQGiBEQ7TOgRBADvaRsIZ3VZ6Qy7PlDpdMm97m0OfvouOj/HhjOM4M3ECbGn4cYh
vN1gK586s3sUsUcNQ8LuWvNsYhxYsVTZymCReJMEDxod0U6/z/oIbpWv5svF3kpl
ogA66Ju/6cZx62RiCSOkskI6A3Waj6xHyEo8AGOPfzbMoOOQ1TS1u9s2FwCgxziL
wADvKYlDZnWM03QtqIJVD8UEAOks9Q2OqFoqKarj6xTRdOYIBVEp2jhozZUZmLmz
pKL9E4NKGfixqxdVimFcRUGM5h7R2w7ORqXjCzpiPmgdv3jJLWDnmHLmMYRYQc8p
5nqo8mxuO3zJugxBemWoacBDd1MJaH7nK20Hsk9L/jvU/qLxPJotMStTnwO+EpsK
HlihA/9ZpvzR1QWNUd9nSuNR3byJhaXvxqQltsM7tLqAT4qAOJIcMjxr+qESdEbx
NHM5M1Y21ZynrsQw+Fb1WHXNbP79vzOxHoZR0+OXe8uUpkri2d9iOocre3NUdpOO
JHtl6cGGTFILt8tSuOVxMT/+nlo038JQB2jARe4B85O0tkPIPbQybmV1cm8uZGVi
aWFuLm5ldCBhcmNoaXZlIDxtaWNoYWVsLmhhbmtlQGdtYWlsLmNvbT6IRgQQEQgA
BgUCTVHJKwAKCRCNEUVjdcAkyOvzAJ0abJz+f2a6VZG1c9T8NHMTYh1atwCgt0EE
3ZZd/2in64jSzu0miqhXbOKISgQQEQIACgUCSotRlwMFAXgACgkQ93+NsjFEvg8n
JgCfWcdJbILBtpLZCocvOzlLPqJ0Fn0AoI4EpJRxoUnrtzBGUC1MqecU7WsDiGAE
ExECACAFAkqLUWcCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRCl0y8BJkml
qVklAJ4h2V6MdQkSAThF5c2Gkq6eSoIQYQCeM0DWyB9Bl+tTPSTYXwwZi2uoif20
QmFwc3kuZ3NlLnVuaS1tYWdkZWJ1cmcuZGUgRGViaWFuIEFyY2hpdmUgPG1pY2hh
ZWwuaGFua2VAZ21haWwuY29tPohGBBARAgAGBQJEO03FAAoJEPd/jbIxRL4PU18A
n3tn7i4qdlMi8kHbYWFoabsKc9beAJ9sl/leZNCYNMGhz+u6BQgyeLKw94heBBMR
AgAeBQJEO0zoAhsDBgsJCAcDAgMVAgMDFgIBAh4BAheAAAoJEKXTLwEmSaWpVdoA
n27DvtZizNEbhz3wRUPQMiQjtqdvAJ9rS9YdPe5h5o5gHx3mw3BSkOttdYheBBMR
AgAeBQJEO0zoAhsDBgsJCAcDAgMVAgMDFgIBAh4BAheAAAoJEKXTLwEmSaWpVdoA
oLhwWL+E+2I9lrUf4Lf26quOK9vLAKC9ZpIF2tUirFFkBWnQvu13/TA0SokCHAQQ
AQIABgUCTSNBgQAKCRDAc9Iof/uem4NpEACQ8jxmaCaS/qk/Y4GiwLA5bvKosG3B
iARZ2v5UWqCZQ1tS56yKse/lCIzXQqU9BnYW6wOI2rvFf9meLfd8h96peG6oKscs
fbclLDIf68bBvGBQaD0VYFi/Fk/rxmTQBOCQ3AJZs8O5rIM4gPGE0QGvSZ1h7VRw
3Uyeg4jKXLIeJn2xEmOJgt3auAR2FyKbzHaX9JCoByJZ/eU23akNl9hgt7ePlpXo
74KNYC58auuMUhCq3BQDB+II4ERYMcmFp1N5ZG05Cl6jcaRRHDXz+Ax6DWprRI1+
RH/Yyae6LmKpeJNwd+vM14aawnNO9h8IAQ+aJ3oYZdRhGyybbin3giJ10hmWveg/
Pey91Nh9vBCHdDkdPU0s9zE7z/PHT0c5ccZRukxfZfkrlWQ5iqu3V064ku5f4PBy
8UPSkETcjYgDnrdnwqIAO+oVg/SFlfsOzftnwUrvwIcZlXAgtP6MEEAs/38e/JIN
g4VrpdAy7HMGEUsh6Ah6lvGQr+zBnG44XwKfl7e0uCYkrAzUJRGM5vx9iXvFMcMu
jv9EBNNBOU8/Y6MBDzGZhgaoeI27nrUvaveJXjAiDKAQWBLjtQjINZ8I9uaSGOul
8kpbFavE4eS3+KhISrSHe4DuAa3dk9zI+FiPvXY1ZyfQBtNpR+gYFY6VxMbHhY1U
lSLHO2eUIQLdYbRITmV1cm9EZWJpYW4gQXJjaGl2ZSBLZXkgPHBrZy1leHBwc3kt
bWFpbnRhaW5lcnNAbGlzdHMuYWxpb3RoLmRlYmlhbi5vcmc+iEYEEBEIAAYFAk1R
yQYACgkQjRFFY3XAJMgEWwCggx4Gqlcrt76TSMlbU94cESo55AEAoJ3asQEMpe8t
QUX+5aikw3z1AUoCiEoEEBECAAoFAkqf/3cDBQF4AAoJEPd/jbIxRL4PxyMAoKUI
RPWlHCj/+HSFfwhos68wcSwmAKChuC00qutDro+AOo+uuq6YoHXj+ohgBBMRAgAg
BQJKn/8bAhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQpdMvASZJpalDggCe
KF9KOgOPdQbFnKXl8KtHory4EEwAnA7jxgorE6kk2QHEXFSF8LzOOH4GiGMEExEC
ACMCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCSp//RgIZAQAKCRCl0y8BJkml
qekFAKCRyt4+FoCzmBbRUUP3Cr8PzH++IgCgkno4vdjsWdyAey8e0KpITTXMFrmJ
AhwEEAECAAYFAk0jQYEACgkQwHPSKH/7npsFfw/+P8B8hpM3+T1fgboBa4R32deu
n8m6b8vZMXwuo/awQtMpzjem8JGXSUQm8iiX4hDtjq6ZoPrlN8T4jNmviBt/F5jI
Jji/PYmhq+Zn9s++mfx+aF4IJrcHJWFkg/6kJzn4oSdl/YlvKf4VRCcQNtj4xV87
GsdamnzU17XapLVMbSaVKh+6Af7ZLDerEH+iAq733HsYaTK+1xKmN7EFVXgS7bZ1
9C4LTzc97bVHSywpT9yIrg9QQs/1kshfVIHDKyhjF6IwzSVbeGAIL3Oqo5zOMkWv
7JlEIkkhTyl+FETxNMTMYjAk+Uei3kRodneq3YBF2uFYSEzrXQgHAyn37geiaMYj
h8wu6a85nG1NS0SdxiZDIePmbvD9vWxFZUWYJ/h9ifsLivWcVXlvHoQ0emd+n2ai
FhAck2xsuyHgnGIZMHww5IkQdu/TMqvbcR6d8Xulh+C4Tq7ppy+oTLADSBKII++p
JQioYydRD529EUJgVlhyH27X6YAk3FuRD3zYZRYS2QECiKXvS665o3JRJ0ZSqNgv
YOom8M0zz6bI9grnUoivMI4o7ISpE4ZwffEd37HVzmraaUHDXRhkulFSf1ImtXoj
V9nNSM5p/+9eP7OioTZhSote6Vj6Ja1SZeRkXZK7BwqPbdO0VsYOb7G//ZiOlqs+
paRr92G/pwBfj5Dq8EK5Ag0ERDtM9RAIAN0EJqBPvLN0tEin/y4Fe0R4n+E+zNXg
bBsq4WidwyUFy3h/6u86FYvegXwUqVS2OsEs5MwPcCVJOfaEthF7I89QJnP9Nfx7
V5I9yFB53o9ii38BN7X+9gSjpfwXOvf/wIDfggxX8/wRFel37GRB7TiiABRArBez
s5x+zTXvT++WPhElySj0uY8bjVR6tso+d65K0UesvAa7PPWeRS+3nhqABSFLuTTT
MMbnVXCGesBrYHlFVXClAYrSIOX8Ub/UnuEYs9+hIV7U4jKzRF9WJhIC1cXHPmOh
vleAf/I9h/0KahD7HLYud40pNBo5tW8jSfp2/Q8TIE0xxshd51/xy4MAAwUH+wWn
zsYVk981OKUEXul8JPyPxbw05fOd6gF4MJ3YodO+6dfoyIl3bewk+11KXZQALKaO
1xmkAEO1RqizPeetoadBVkQBp5xPudsVElUTOX0pTYhkUd3iBilsCYKK1/KQ9KzD
I+O/lRsm6L9lc6rV0IgPU00P4BAwR+x8Rw7TJFbuS0miR3lP1NSguz+/kpjxzmGP
LyHJ+LVDYFkk6t0jPXhqFdUY6McUTBDEvavTGlVO062l9APTmmSMVFDsPN/rBes2
rYhuuT+lDp+gcaS1UoaYCIm9kKOteQBnowX9V74Z+HKEYLtwILaSnNe6/fNSTvyj
g0z+R+sPCY4nHewbVC+ISQQYEQIACQUCRDtM9QIbDAAKCRCl0y8BJkmlqbecAJ9B
UdSKVg9H+fQNyP5sbOjj4RDtdACfXHrRHa2+XjJP0dhpvJ8IfvYnQsU=
=fAJZ
-----END PGP PUBLIC KEY BLOCK-----


================================================
FILE: docs/Makefile
================================================
# Makefile for Sphinx documentation
#

# You can set these variables from the command line.
SPHINXOPTS    =
SPHINXBUILD   = sphinx-build
PAPER         =
BUILDDIR      = _build
PYTHONPATH    = $(PWD)

# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif

# Internal variables.
PAPEROPT_a4     = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source

.PHONY: help
help:
	@echo "Please use \`make <target>' where <target> is one of"
	@echo "  html       to make standalone HTML files"
	@echo "  dirhtml    to make HTML files named index.html in directories"
	@echo "  singlehtml to make a single large HTML file"
	@echo "  pickle     to make pickle files"
	@echo "  json       to make JSON files"
	@echo "  htmlhelp   to make HTML files and a HTML help project"
	@echo "  qthelp     to make HTML files and a qthelp project"
	@echo "  applehelp  to make an Apple Help Book"
	@echo "  devhelp    to make HTML files and a Devhelp project"
	@echo "  epub       to make an epub"
	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
	@echo "  latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
	@echo "  text       to make text files"
	@echo "  man        to make manual pages"
	@echo "  texinfo    to make Texinfo files"
	@echo "  info       to make Texinfo files and run them through makeinfo"
	@echo "  gettext    to make PO message catalogs"
	@echo "  changes    to make an overview of all changed/added/deprecated items"
	@echo "  xml        to make Docutils-native XML files"
	@echo "  pseudoxml  to make pseudoxml-XML files for display purposes"
	@echo "  linkcheck  to check all external links for integrity"
	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
	@echo "  coverage   to run coverage check of the documentation (if enabled)"

.PHONY: clean
clean:
	rm -rf $(BUILDDIR)/*

.PHONY: html
html:
	PYTHONPATH=$(PYTHONPATH) $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
	@echo
	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."

.PHONY: dirhtml
dirhtml:
	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
	@echo
	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."

.PHONY: singlehtml
singlehtml:
	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
	@echo
	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."

.PHONY: pickle
pickle:
	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
	@echo
	@echo "Build finished; now you can process the pickle files."

.PHONY: json
json:
	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
	@echo
	@echo "Build finished; now you can process the JSON files."

.PHONY: htmlhelp
htmlhelp:
	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
	@echo
	@echo "Build finished; now you can run HTML Help Workshop with the" \
	      ".hhp project file in $(BUILDDIR)/htmlhelp."

.PHONY: qthelp
qthelp:
	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
	@echo
	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/mriqc.qhcp"
	@echo "To view the help file:"
	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/mriqc.qhc"

.PHONY: applehelp
applehelp:
	$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
	@echo
	@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
	@echo "N.B. You won't be able to view it unless you put it in" \
	      "~/Library/Documentation/Help or install it in your application" \
	      "bundle."

.PHONY: devhelp
devhelp:
	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
	@echo
	@echo "Build finished."
	@echo "To view the help file:"
	@echo "# mkdir -p $$HOME/.local/share/devhelp/mriqc"
	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/mriqc"
	@echo "# devhelp"

.PHONY: epub
epub:
	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
	@echo
	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."

.PHONY: latex
latex:
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
	@echo
	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
	@echo "Run \`make' in that directory to run these through (pdf)latex" \
	      "(use \`make latexpdf' here to do that automatically)."

.PHONY: latexpdf
latexpdf:
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
	@echo "Running LaTeX files through pdflatex..."
	$(MAKE) -C $(BUILDDIR)/latex all-pdf
	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."

.PHONY: latexpdfja
latexpdfja:
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
	@echo "Running LaTeX files through platex and dvipdfmx..."
	$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."

.PHONY: text
text:
	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
	@echo
	@echo "Build finished. The text files are in $(BUILDDIR)/text."

.PHONY: man
man:
	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
	@echo
	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."

.PHONY: texinfo
texinfo:
	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
	@echo
	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
	@echo "Run \`make' in that directory to run these through makeinfo" \
	      "(use \`make info' here to do that automatically)."

.PHONY: info
info:
	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
	@echo "Running Texinfo files through makeinfo..."
	make -C $(BUILDDIR)/texinfo info
	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."

.PHONY: gettext
gettext:
	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
	@echo
	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."

.PHONY: changes
changes:
	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
	@echo
	@echo "The overview file is in $(BUILDDIR)/changes."

.PHONY: linkcheck
linkcheck:
	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
	@echo
	@echo "Link check complete; look for any errors in the above output " \
	      "or in $(BUILDDIR)/linkcheck/output.txt."

.PHONY: doctest
doctest:
	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
	@echo "Testing of doctests in the sources finished, look at the " \
	      "results in $(BUILDDIR)/doctest/output.txt."

.PHONY: coverage
coverage:
	$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
	@echo "Testing of coverage in the sources finished, look at the " \
	      "results in $(BUILDDIR)/coverage/python.txt."

.PHONY: xml
xml:
	$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
	@echo
	@echo "Build finished. The XML files are in $(BUILDDIR)/xml."

.PHONY: pseudoxml
pseudoxml:
	$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
	@echo
	@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."


================================================
FILE: docs/notebooks/.gitignore
================================================
.ipynb_checkpoints/
ABIDE-BIDS/
data/
example_artifacts_dataset/
out/
temp/
*.svg


================================================
FILE: docs/notebooks/MRIQC Web API.ipynb
================================================
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Querying the MRIQC Web API\n",
    "\n",
    "This notebook shows how the web-API can be leveraged to analyze the image quality metrics (IQMs) that have been extracted with MRIQC\n",
    "\n",
    "This notebook is a derivative work of https://gist.github.com/chrisfilo/eccdb8b98f8e74d24a3395a49fbadf03"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import json\n",
    "import multiprocessing as mp\n",
    "import urllib.request\n",
    "from json import load\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import pylab as plt\n",
    "import seaborn as sns\n",
    "from pandas.io.json import json_normalize\n",
Download .txt
gitextract_jfsbcv57/

├── .circleci/
│   ├── circle_T1w.txt
│   ├── circle_bold.txt
│   └── config.yml
├── .codecov.yml
├── .dockerignore
├── .git_archival.txt
├── .gitattributes
├── .github/
│   ├── config.yml
│   ├── dependabot.yml
│   └── workflows/
│       └── pythonpackage.yml
├── .gitignore
├── .mailmap
├── .maint/
│   ├── CONTRIBUTORS.md
│   ├── FORMER.md
│   ├── MAINTAINERS.md
│   ├── PIs.md
│   ├── ROADMAP.md
│   ├── requirements.txt
│   ├── update_authors.py
│   └── update_changes.sh
├── .readthedocs.yaml
├── .zenodo.json
├── AGENTS.md
├── CHANGES.rst
├── Dockerfile
├── Dockerfile_devel
├── LICENSE
├── MANIFEST.in
├── Makefile
├── README.rst
├── docker/
│   └── files/
│       └── neurodebian.gpg
├── docs/
│   ├── Makefile
│   ├── notebooks/
│   │   ├── .gitignore
│   │   ├── MRIQC Web API.ipynb
│   │   ├── Paper-v1.0.ipynb
│   │   ├── Paper-v2.0.ipynb
│   │   ├── SpikesPlotter.ipynb
│   │   ├── Supplemental Materials.ipynb
│   │   └── finding_spikes.ipynb
│   └── source/
│       ├── _static/
│       │   ├── bold-1subject-1task.html
│       │   ├── bold-1subject-8tasks.html
│       │   ├── example_anatreport.html
│       │   └── example_funcreport.html
│       ├── about.rst
│       ├── changes.rst
│       ├── conf.py
│       ├── dsa.rst
│       ├── index.rst
│       ├── install.rst
│       ├── iqms/
│       │   ├── bold.rst
│       │   ├── dwi.rst
│       │   └── t1w.rst
│       ├── license.rst
│       ├── measures.rst
│       ├── reports/
│       │   ├── bold.rst
│       │   ├── group.rst
│       │   └── smri.rst
│       ├── reports.rst
│       ├── resources/
│       │   ├── mriqc.sbatch
│       │   └── sbatch.sh
│       ├── usage.rst
│       └── workflows.rst
├── long_description.rst
├── mriqc/
│   ├── __init__.py
│   ├── __main__.py
│   ├── _warnings.py
│   ├── bin/
│   │   ├── __init__.py
│   │   ├── abide2bids.py
│   │   ├── dfcheck.py
│   │   ├── fs2gif.py
│   │   ├── labeler.py
│   │   ├── messages.py
│   │   ├── mriqcwebapi_test.py
│   │   ├── nib_hash.py
│   │   └── subject_wrangler.py
│   ├── cli/
│   │   ├── __init__.py
│   │   ├── parser.py
│   │   ├── run.py
│   │   ├── version.py
│   │   └── workflow.py
│   ├── config.py
│   ├── conftest.py
│   ├── data/
│   │   ├── NOTICE
│   │   ├── __init__.py
│   │   ├── bootstrap-anat.yml
│   │   ├── bootstrap-dwi.yml
│   │   ├── bootstrap-func.yml
│   │   ├── config-example.toml
│   │   ├── config.py
│   │   ├── fsexport.tcl
│   │   ├── itk_identity.tfm
│   │   ├── reports/
│   │   │   ├── embed_resources/
│   │   │   │   ├── boxplots.css
│   │   │   │   └── boxplots.js
│   │   │   ├── group.html
│   │   │   └── resources/
│   │   │       ├── DO_NOT_REMOVE_OR_MODIFY
│   │   │       ├── boxplots.css
│   │   │       └── boxplots.js
│   │   ├── testdata/
│   │   │   ├── group_T1w.tsv
│   │   │   └── group_bold.tsv
│   │   └── tests/
│   │       ├── ds000005/
│   │       │   ├── CHANGES
│   │       │   ├── README
│   │       │   ├── dataset_description.json
│   │       │   ├── participants.tsv
│   │       │   ├── sub-01/
│   │       │   │   └── func/
│   │       │   │       ├── sub-01_task-mixedgamblestask_run-01_bold.json
│   │       │   │       ├── sub-01_task-mixedgamblestask_run-01_events.tsv
│   │       │   │       ├── sub-01_task-mixedgamblestask_run-02_events.tsv
│   │       │   │       └── sub-01_task-mixedgamblestask_run-03_events.tsv
│   │       │   └── task-mixedgamblestask_bold.json
│   │       ├── ds002785/
│   │       │   ├── dataset_description.json
│   │       │   ├── sub-0017/
│   │       │   │   └── anat/
│   │       │   │       └── sub-0017_T1w.json
│   │       │   └── sub-0042/
│   │       │       └── anat/
│   │       │           └── sub-0042_T1w.json
│   │       ├── gh1086-ds004134.oracle
│   │       ├── gh921-dmd-20220428-0.oracle
│   │       └── gh921-dmd-20230319-0.oracle
│   ├── engine/
│   │   ├── __init__.py
│   │   └── plugin.py
│   ├── instrumentation/
│   │   ├── __init__.py
│   │   ├── __main__.py
│   │   ├── resources.py
│   │   └── viz.py
│   ├── interfaces/
│   │   ├── __init__.py
│   │   ├── anatomical.py
│   │   ├── bids.py
│   │   ├── common/
│   │   │   ├── __init__.py
│   │   │   ├── conform_image.py
│   │   │   └── ensure_size.py
│   │   ├── diffusion.py
│   │   ├── functional.py
│   │   ├── reports.py
│   │   ├── synthstrip.py
│   │   ├── tests/
│   │   │   └── test_interfaces.py
│   │   ├── transitional.py
│   │   └── webapi.py
│   ├── messages.py
│   ├── qc/
│   │   ├── __init__.py
│   │   ├── anatomical.py
│   │   ├── diffusion.py
│   │   ├── functional.py
│   │   └── tests/
│   │       ├── __init__.py
│   │       ├── test_anatomical.py
│   │       └── test_diffusion.py
│   ├── reports/
│   │   ├── __init__.py
│   │   ├── group.py
│   │   └── individual.py
│   ├── synthstrip/
│   │   ├── ORIGINAL_LICENSE
│   │   ├── __init__.py
│   │   ├── __main__.py
│   │   ├── cli.py
│   │   └── model.py
│   ├── testing.py
│   ├── tests/
│   │   ├── test_config.py
│   │   ├── test_main.py
│   │   ├── test_parser.py
│   │   └── test_reports.py
│   ├── utils/
│   │   ├── __init__.py
│   │   ├── bids.py
│   │   ├── debug.py
│   │   ├── misc.py
│   │   └── telemetry.py
│   └── workflows/
│       ├── __init__.py
│       ├── anatomical/
│       │   ├── __init__.py
│       │   ├── base.py
│       │   └── output.py
│       ├── core.py
│       ├── diffusion/
│       │   ├── __init__.py
│       │   ├── base.py
│       │   └── output.py
│       ├── functional/
│       │   ├── __init__.py
│       │   ├── base.py
│       │   └── output.py
│       ├── shared.py
│       └── utils.py
└── pyproject.toml
Download .txt
SYMBOL INDEX (371 symbols across 59 files)

FILE: .maint/update_authors.py
  function read_md_table (line 11) | def read_md_table(md_text):
  function sort_contributors (line 59) | def sort_contributors(entries, git_lines, exclude=None, last=None):
  function get_git_lines (line 109) | def get_git_lines(fname='line-contributors.txt'):
  function _namelast (line 144) | def _namelast(inlist):
  function cli (line 155) | def cli():
  function zenodo (line 167) | def zenodo(
  function publication (line 246) | def publication(

FILE: mriqc/_warnings.py
  class _LogFormatter (line 50) | class _LogFormatter(logging.Formatter):
    method __init__ (line 55) | def __init__(self, datefmt=None, colored=True, **kwargs):
    method format (line 65) | def format(self, record):

FILE: mriqc/bin/abide2bids.py
  function main (line 46) | def main():
  function fetch (line 103) | def fetch(args: (str, str, str, str)) -> (str, str):
  function _myerror (line 179) | def _myerror(message: str):

FILE: mriqc/bin/dfcheck.py
  function read_iqms (line 38) | def read_iqms(feat_file):
  function main (line 74) | def main():

FILE: mriqc/bin/fs2gif.py
  function main (line 40) | def main():
  function _xvfb_run (line 240) | def _xvfb_run(wait=5, server_args='-screen 0, 1600x1200x24', logs=None):
  function _myerror (line 259) | def _myerror(msg):

FILE: mriqc/bin/labeler.py
  function num_rows (line 32) | def num_rows(data):
  function main (line 39) | def main():

FILE: mriqc/bin/mriqcwebapi_test.py
  function get_parser (line 26) | def get_parser():
  function main (line 57) | def main():

FILE: mriqc/bin/nib_hash.py
  function get_parser (line 35) | def get_parser() -> ArgumentParser:
  function get_hash (line 53) | def get_hash(nii_file: str) -> str:
  function main (line 71) | def main():

FILE: mriqc/bin/subject_wrangler.py
  function main (line 37) | def main():

FILE: mriqc/cli/parser.py
  function _parse_participant_labels (line 30) | def _parse_participant_labels(value):
  function _build_parser (line 51) | def _build_parser():
  function parse_args (line 488) | def parse_args(args=None, namespace=None):

FILE: mriqc/cli/run.py
  function format_elapsed_time (line 26) | def format_elapsed_time(elapsed_timedelta):
  function main (line 35) | def main(argv=None):

FILE: mriqc/cli/version.py
  function check_latest (line 37) | def check_latest():
  function is_flagged (line 85) | def is_flagged():

FILE: mriqc/cli/workflow.py
  function build_workflow (line 34) | def build_workflow(config_file, retval):

FILE: mriqc/config.py
  class _Config (line 234) | class _Config:
    method __init__ (line 240) | def __init__(self):
    method load (line 245) | def load(cls, sections, init=True):
    method get (line 263) | def get(cls) -> dict[str, Any]:
  class settings (line 279) | class settings(_Config):
  class environment (line 290) | class environment(_Config):
  class nipype (line 334) | class nipype(_Config):
    method get_plugin (line 364) | def get_plugin(cls) -> dict[str, Any]:
    method init (line 377) | def init(cls) -> None:
  class execution (line 394) | class execution(_Config):
    method init (line 491) | def init(cls) -> None:
  class workflow (line 576) | class workflow(_Config):
    method init (line 616) | def init(cls) -> None:
  class loggers (line 629) | class loggers:
    method init (line 648) | def init(cls) -> None:
    method getLogger (line 691) | def getLogger(cls, name) -> logging.Logger:
  function from_dict (line 700) | def from_dict(sections: dict) -> None:
  function load (line 707) | def load(filename: str | os.PathLike) -> None:
  function get (line 727) | def get(flat: bool = False) -> dict[str, dict[str, Any]]:
  function dumps (line 746) | def dumps() -> str:
  function to_filename (line 753) | def to_filename(
  function _process_initializer (line 785) | def _process_initializer(config_file: Path) -> None:
  function restore_env (line 810) | def restore_env() -> None:

FILE: mriqc/conftest.py
  function expand_namespace (line 45) | def expand_namespace(doctest_namespace):
  function testdata_path (line 74) | def testdata_path():
  function workdir (line 79) | def workdir():
  function outdir (line 84) | def outdir():

FILE: mriqc/data/config.py
  class GroupTemplate (line 30) | class GroupTemplate:
    method __init__ (line 38) | def __init__(self):
    method compile (line 49) | def compile(self, configs):
    method generate_conf (line 54) | def generate_conf(self, configs, path):

FILE: mriqc/data/reports/embed_resources/boxplots.js
  function makeDistroChart (line 22) | function makeDistroChart(settings) {

FILE: mriqc/data/reports/resources/boxplots.js
  function makeDistroChart (line 22) | function makeDistroChart(settings) {

FILE: mriqc/engine/plugin.py
  function run_node (line 41) | def run_node(node, updatehash, taskid):
  class PluginBase (line 82) | class PluginBase:
    method __init__ (line 85) | def __init__(self, plugin_args=None):
    method run (line 93) | def run(self, graph, config, updatehash=False):
  class DistributedPluginBase (line 114) | class DistributedPluginBase(PluginBase):
    method __init__ (line 147) | def __init__(self, plugin_args=None):
    method _prerun_check (line 160) | def _prerun_check(self, graph):
    method _postrun_check (line 163) | def _postrun_check(self):
    method run (line 166) | def run(self, graph, config, updatehash=False):
    method _get_result (line 238) | def _get_result(self, taskid):
    method _submit_job (line 241) | def _submit_job(self, node, updatehash=False):
    method _clear_task (line 244) | def _clear_task(self, taskid):
    method _clean_queue (line 247) | def _clean_queue(self, jobid, graph, result=None):
    method _send_procs_to_workers (line 271) | def _send_procs_to_workers(self, updatehash=False, graph=None):
    method _submit_mapnode (line 274) | def _submit_mapnode(self, jobid):
    method _local_hash_check (line 299) | def _local_hash_check(self, jobid, graph):
    method _task_finished_cb (line 323) | def _task_finished_cb(self, jobid, cached=False):
    method _generate_dependency_list (line 342) | def _generate_dependency_list(self, graph):
    method _remove_node_deps (line 358) | def _remove_node_deps(self, jobid, graph):
    method _remove_node_dirs (line 375) | def _remove_node_dirs(self):
  class MultiProcPlugin (line 394) | class MultiProcPlugin(DistributedPluginBase):
    method __init__ (line 423) | def __init__(self, pool=None, plugin_args=None):
    method _async_callback (line 455) | def _async_callback(self, args):
    method _get_result (line 459) | def _get_result(self, taskid):
    method _clear_task (line 462) | def _clear_task(self, taskid):
    method _submit_job (line 465) | def _submit_job(self, node, updatehash=False):
    method _prerun_check (line 477) | def _prerun_check(self, graph):
    method _postrun_check (line 493) | def _postrun_check(self):
    method _check_resources (line 496) | def _check_resources(self, running_tasks):
    method _send_procs_to_workers (line 506) | def _send_procs_to_workers(self, updatehash=False, graph=None):
    method _sort_jobs (line 611) | def _sort_jobs(self, jobids, scheduler='tsort'):
  function report_crash (line 620) | def report_crash(node, traceback=None, hostname=None):

FILE: mriqc/instrumentation/resources.py
  function FindProcess (line 48) | def FindProcess(process_name):
  function sample (line 74) | def sample(
  function parse_sample (line 108) | def parse_sample(datapoint, timestamp=None, attrs=SAMPLE_ATTRS):
  function sample2file (line 130) | def sample2file(pid=None, recursive=True, timestamp=None, fd=None, flush...
  class ResourceRecorder (line 147) | class ResourceRecorder(Process):
    method __init__ (line 150) | def __init__(self, pid, frequency=0.2, log_file=None, exclude_probe=Tr...
    method run (line 169) | def run(self, *args, **kwargs):
    method stop (line 214) | def stop(self, *args):

FILE: mriqc/instrumentation/viz.py
  function plot (line 32) | def plot(filename, param='mem_vsm_mb', mask_processes=(), out_file=None):

FILE: mriqc/interfaces/__init__.py
  class DerivativesDataSink (line 40) | class DerivativesDataSink(_DDSink):

FILE: mriqc/interfaces/anatomical.py
  class StructuralQCInputSpec (line 57) | class StructuralQCInputSpec(BaseInterfaceInputSpec):
  class StructuralQCOutputSpec (line 77) | class StructuralQCOutputSpec(TraitedSpec):
  class StructuralQC (line 98) | class StructuralQC(SimpleInterface):
    method _run_interface (line 108) | def _run_interface(self, runtime):  # pylint: disable=R0914,E1101
  class _ArtifactMaskInputSpec (line 270) | class _ArtifactMaskInputSpec(BaseInterfaceInputSpec):
  class _ArtifactMaskOutputSpec (line 289) | class _ArtifactMaskOutputSpec(TraitedSpec):
  class ArtifactMask (line 295) | class ArtifactMask(SimpleInterface):
    method _run_interface (line 303) | def _run_interface(self, runtime):
  class ComputeQI2InputSpec (line 356) | class ComputeQI2InputSpec(BaseInterfaceInputSpec):
  class ComputeQI2OutputSpec (line 361) | class ComputeQI2OutputSpec(TraitedSpec):
  class ComputeQI2 (line 366) | class ComputeQI2(SimpleInterface):
    method _run_interface (line 374) | def _run_interface(self, runtime):
  class HarmonizeInputSpec (line 383) | class HarmonizeInputSpec(BaseInterfaceInputSpec):
  class HarmonizeOutputSpec (line 392) | class HarmonizeOutputSpec(TraitedSpec):
  class Harmonize (line 396) | class Harmonize(SimpleInterface):
    method _run_interface (line 404) | def _run_interface(self, runtime):
  class RotationMaskInputSpec (line 435) | class RotationMaskInputSpec(BaseInterfaceInputSpec):
  class RotationMaskOutputSpec (line 439) | class RotationMaskOutputSpec(TraitedSpec):
  class RotationMask (line 443) | class RotationMask(SimpleInterface):
    method _run_interface (line 451) | def _run_interface(self, runtime):
  function artifact_mask (line 487) | def artifact_mask(imdata, airdata, distance, zscore=10.0):
  function fuzzy_jaccard (line 511) | def fuzzy_jaccard(in_tpms, in_mni_tpms):

FILE: mriqc/interfaces/bids.py
  class IQMFileSinkInputSpec (line 43) | class IQMFileSinkInputSpec(DynamicTraitedSpec, BaseInterfaceInputSpec):
    method __setattr__ (line 65) | def __setattr__(self, key, value):
  class IQMFileSinkOutputSpec (line 76) | class IQMFileSinkOutputSpec(TraitedSpec):
  class IQMFileSink (line 80) | class IQMFileSink(SimpleInterface):
    method __init__ (line 85) | def __init__(self, fields=None, force_run=True, **inputs):
    method _add_field (line 102) | def _add_field(self, name, value=Undefined):
    method _gen_outfile (line 107) | def _gen_outfile(self):
    method _run_interface (line 133) | def _run_interface(self, runtime):
  function _process_name (line 204) | def _process_name(name, val):

FILE: mriqc/interfaces/common/conform_image.py
  class ConformImageInputSpec (line 58) | class ConformImageInputSpec(BaseInterfaceInputSpec):
  class ConformImageOutputSpec (line 68) | class ConformImageOutputSpec(TraitedSpec):
  class ConformImage (line 76) | class ConformImage(SimpleInterface):
    method _warn_suspicious_dtype (line 137) | def _warn_suspicious_dtype(self, dtype: int) -> None:
    method _check_dtype (line 152) | def _check_dtype(self, nii: nib.Nifti1Image) -> nib.Nifti1Image:
    method _run_interface (line 179) | def _run_interface(self, runtime):

FILE: mriqc/interfaces/common/ensure_size.py
  class EnsureSizeInputSpec (line 51) | class EnsureSizeInputSpec(BaseInterfaceInputSpec):
  class EnsureSizeOutputSpec (line 61) | class EnsureSizeOutputSpec(TraitedSpec):
  class EnsureSize (line 70) | class EnsureSize(SimpleInterface):
    method _check_size (line 78) | def _check_size(self, nii: nib.Nifti1Image) -> bool:
    method _run_interface (line 91) | def _run_interface(self, runtime):

FILE: mriqc/interfaces/diffusion.py
  class _DiffusionQCInputSpec (line 74) | class _DiffusionQCInputSpec(_BaseInterfaceInputSpec):
  class _DiffusionQCOutputSpec (line 155) | class _DiffusionQCOutputSpec(TraitedSpec):
  class DiffusionQC (line 175) | class DiffusionQC(SimpleInterface):
    method _run_interface (line 181) | def _run_interface(self, runtime):
  class _ReadDWIMetadataOutputSpec (line 318) | class _ReadDWIMetadataOutputSpec(_ReadSidecarJSONOutputSpec):
  class ReadDWIMetadata (line 328) | class ReadDWIMetadata(ReadSidecarJSON):
    method _run_interface (line 335) | def _run_interface(self, runtime):
  class _WeightedStatInputSpec (line 352) | class _WeightedStatInputSpec(_BaseInterfaceInputSpec):
  class _WeightedStatOutputSpec (line 363) | class _WeightedStatOutputSpec(_TraitedSpec):
  class WeightedStat (line 367) | class WeightedStat(SimpleInterface):
    method _run_interface (line 373) | def _run_interface(self, runtime):
  class _NumberOfShellsInputSpec (line 398) | class _NumberOfShellsInputSpec(_BaseInterfaceInputSpec):
  class _NumberOfShellsOutputSpec (line 404) | class _NumberOfShellsOutputSpec(_TraitedSpec):
  class NumberOfShells (line 432) | class NumberOfShells(SimpleInterface):
    method _run_interface (line 453) | def _run_interface(self, runtime):
  class _ExtractOrientationsInputSpec (line 521) | class _ExtractOrientationsInputSpec(_BaseInterfaceInputSpec):
  class _ExtractOrientationsOutputSpec (line 527) | class _ExtractOrientationsOutputSpec(_TraitedSpec):
  class ExtractOrientations (line 536) | class ExtractOrientations(SimpleInterface):
    method _run_interface (line 542) | def _run_interface(self, runtime):
  class _CorrectSignalDriftInputSpec (line 568) | class _CorrectSignalDriftInputSpec(_BaseInterfaceInputSpec):
  class _CorrectSignalDriftOutputSpec (line 581) | class _CorrectSignalDriftOutputSpec(_TraitedSpec):
  class CorrectSignalDrift (line 588) | class CorrectSignalDrift(SimpleInterface):
    method _run_interface (line 594) | def _run_interface(self, runtime):
  class _SplitShellsInputSpec (line 677) | class _SplitShellsInputSpec(_BaseInterfaceInputSpec):
  class _SplitShellsOutputSpec (line 682) | class _SplitShellsOutputSpec(_TraitedSpec):
  class SplitShells (line 686) | class SplitShells(SimpleInterface):
    method _run_interface (line 692) | def _run_interface(self, runtime):
  class _FilterShellsInputSpec (line 716) | class _FilterShellsInputSpec(_BaseInterfaceInputSpec):
  class _FilterShellsOutputSpec (line 723) | class _FilterShellsOutputSpec(_TraitedSpec):
  class FilterShells (line 730) | class FilterShells(SimpleInterface):
    method _run_interface (line 736) | def _run_interface(self, runtime):
  class _DiffusionModelInputSpec (line 777) | class _DiffusionModelInputSpec(_BaseInterfaceInputSpec):
  class _DiffusionModelOutputSpec (line 786) | class _DiffusionModelOutputSpec(_TraitedSpec):
  class DiffusionModel (line 797) | class DiffusionModel(SimpleInterface):
    method _run_interface (line 809) | def _run_interface(self, runtime):
  class _CCSegmentationInputSpec (line 948) | class _CCSegmentationInputSpec(_BaseInterfaceInputSpec):
  class _CCSegmentationOutputSpec (line 967) | class _CCSegmentationOutputSpec(_TraitedSpec):
  class CCSegmentation (line 973) | class CCSegmentation(SimpleInterface):
    method _run_interface (line 979) | def _run_interface(self, runtime):
  class _SpikingVoxelsMaskInputSpec (line 1070) | class _SpikingVoxelsMaskInputSpec(_BaseInterfaceInputSpec):
  class _SpikingVoxelsMaskOutputSpec (line 1082) | class _SpikingVoxelsMaskOutputSpec(_TraitedSpec):
  class SpikingVoxelsMask (line 1086) | class SpikingVoxelsMask(SimpleInterface):
    method _run_interface (line 1092) | def _run_interface(self, runtime):
  class _PIESNOInputSpec (line 1130) | class _PIESNOInputSpec(_BaseInterfaceInputSpec):
  class _PIESNOOutputSpec (line 1135) | class _PIESNOOutputSpec(_TraitedSpec):
  class PIESNO (line 1140) | class PIESNO(SimpleInterface):
    method _run_interface (line 1146) | def _run_interface(self, runtime):
  class _RotateVectorsInputSpec (line 1175) | class _RotateVectorsInputSpec(_BaseInterfaceInputSpec):
  class _RotateVectorsOutputSpec (line 1189) | class _RotateVectorsOutputSpec(_TraitedSpec):
  class RotateVectors (line 1202) | class RotateVectors(SimpleInterface):
    method _run_interface (line 1208) | def _run_interface(self, runtime):
  function _rms (line 1244) | def _rms(estimator, X):
  function _exp_func (line 1261) | def _exp_func(t, A, K, C):
  function segment_corpus_callosum (line 1265) | def segment_corpus_callosum(
  function get_spike_mask (line 1344) | def get_spike_mask(
  function noise_piesno (line 1393) | def noise_piesno(data: np.ndarray, n_channels: int = 4) -> (np.ndarray, ...

FILE: mriqc/interfaces/functional.py
  class FunctionalQCInputSpec (line 47) | class FunctionalQCInputSpec(BaseInterfaceInputSpec):
  class FunctionalQCOutputSpec (line 71) | class FunctionalQCOutputSpec(TraitedSpec):
  class FunctionalQC (line 87) | class FunctionalQC(SimpleInterface):
    method _run_interface (line 97) | def _run_interface(self, runtime):
  class SpikesInputSpec (line 191) | class SpikesInputSpec(BaseInterfaceInputSpec):
  class SpikesOutputSpec (line 211) | class SpikesOutputSpec(TraitedSpec):
  class Spikes (line 217) | class Spikes(SimpleInterface):
    method _run_interface (line 227) | def _run_interface(self, runtime):
  class _SelectEchoInputSpec (line 268) | class _SelectEchoInputSpec(BaseInterfaceInputSpec):
  class _SelectEchoOutputSpec (line 274) | class _SelectEchoOutputSpec(TraitedSpec):
  class SelectEcho (line 280) | class SelectEcho(SimpleInterface):
    method _run_interface (line 290) | def _run_interface(self, runtime):
  class GatherTimeseriesInputSpec (line 305) | class GatherTimeseriesInputSpec(TraitedSpec):
  class GatherTimeseriesOutputSpec (line 326) | class GatherTimeseriesOutputSpec(TraitedSpec):
  class GatherTimeseries (line 331) | class GatherTimeseries(SimpleInterface):
    method _run_interface (line 340) | def _run_interface(self, runtime):
  function _build_timeseries_metadata (line 383) | def _build_timeseries_metadata():
  function find_peaks (line 460) | def find_peaks(data):
  function find_spikes (line 465) | def find_spikes(data, spike_thresh):
  function _robust_zscore (line 483) | def _robust_zscore(data):
  function select_echo (line 487) | def select_echo(
  function _get_echotime (line 568) | def _get_echotime(inlist):

FILE: mriqc/interfaces/reports.py
  class _AddProvenanceInputSpec (line 38) | class _AddProvenanceInputSpec(BaseInterfaceInputSpec):
  class _AddProvenanceOutputSpec (line 45) | class _AddProvenanceOutputSpec(TraitedSpec):
  class AddProvenance (line 49) | class AddProvenance(SimpleInterface):
    method _run_interface (line 55) | def _run_interface(self, runtime):

FILE: mriqc/interfaces/synthstrip.py
  class _SynthStripInputSpec (line 43) | class _SynthStripInputSpec(CommandLineInputSpec):
  class _SynthStripOutputSpec (line 74) | class _SynthStripOutputSpec(TraitedSpec):
  class SynthStrip (line 79) | class SynthStrip(CommandLine):

FILE: mriqc/interfaces/transitional.py
  class GCORInputSpec (line 32) | class GCORInputSpec(CommandLineInputSpec):
  class GCOROutputSpec (line 57) | class GCOROutputSpec(TraitedSpec):
  class GCOR (line 61) | class GCOR(CommandLine):
    method _run_interface (line 84) | def _run_interface(self, runtime):
    method _list_outputs (line 96) | def _list_outputs(self):

FILE: mriqc/interfaces/webapi.py
  class UploadIQMsInputSpec (line 116) | class UploadIQMsInputSpec(BaseInterfaceInputSpec):
  class UploadIQMsOutputSpec (line 129) | class UploadIQMsOutputSpec(TraitedSpec):
  class UploadIQMs (line 134) | class UploadIQMs(SimpleInterface):
    method _run_interface (line 143) | def _run_interface(self, runtime):
  function upload_qc_metrics (line 204) | def upload_qc_metrics(
  function _hashfields (line 303) | def _hashfields(data):

FILE: mriqc/qc/anatomical.py
  function snr (line 220) | def snr(mu_fg, sigma_fg, n):
  function snr_dietrich (line 243) | def snr_dietrich(mu_fg, mad_air=0.0, sigma_air=1.0):
  function cnr (line 273) | def cnr(mu_wm, mu_gm, sigma_air, sigma_wm, sigma_gm):
  function cjv (line 299) | def cjv(mu_wm, mu_gm, sigma_wm, sigma_gm):
  function fber (line 323) | def fber(img, headmask, rotmask=None, decimals=4):
  function efc (line 355) | def efc(img, framemask=None, decimals=4):
  function wm2max (line 406) | def wm2max(img, mu_wm):
  function art_qi1 (line 421) | def art_qi1(airmask, artmask):
  function art_qi2 (line 448) | def art_qi2(
  function volume_fraction (line 515) | def volume_fraction(pvms):
  function rpve (line 540) | def rpve(pvms, seg):
  function summary_stats (line 568) | def summary_stats(
  function _prepare_mask (line 643) | def _prepare_mask(mask, label, erode=True):

FILE: mriqc/qc/diffusion.py
  class ExtremeValueWarning (line 109) | class ExtremeValueWarning(UserWarning):
  function noise_b0 (line 113) | def noise_b0(
  function cc_snr (line 165) | def cc_snr(
  function spike_ppm (line 266) | def spike_ppm(
  function neighboring_dwi_correlation (line 316) | def neighboring_dwi_correlation(

FILE: mriqc/qc/functional.py
  function gsr (line 217) | def gsr(epi_data, mask, direction='y', ref_file=None, out_file=None):

FILE: mriqc/qc/tests/test_anatomical.py
  class GroundTruth (line 38) | class GroundTruth:
    method get_data (line 39) | def get_data(self, sigma, noise='normal'):
  function gtruth (line 64) | def gtruth():
  function test_qi2 (line 107) | def test_qi2(gtruth, sigma):

FILE: mriqc/qc/tests/test_diffusion.py
  function test_spike_ppm (line 29) | def test_spike_ppm():

FILE: mriqc/reports/group.py
  function gen_html (line 33) | def gen_html(csv_file, mod, csv_failed=None, out_file=None):
  function _format_labels (line 338) | def _format_labels(row, id_labels):

FILE: mriqc/reports/individual.py
  function generate_reports (line 34) | def generate_reports():
  function _single_report (line 45) | def _single_report(in_file):

FILE: mriqc/synthstrip/cli.py
  function main (line 48) | def main():
  function conform (line 176) | def conform(input_nii):
  function resample_like (line 227) | def resample_like(image, target, output_dtype=None, cval=0):

FILE: mriqc/synthstrip/model.py
  class StripModel (line 52) | class StripModel(nn.Module):
    method __init__ (line 53) | def __init__(
    method forward (line 135) | def forward(self, x):
  class ConvBlock (line 159) | class ConvBlock(nn.Module):
    method __init__ (line 164) | def __init__(self, ndims, in_channels, out_channels, stride=1, activat...
    method forward (line 176) | def forward(self, x):

FILE: mriqc/testing.py
  function mock_config (line 36) | def mock_config():

FILE: mriqc/tests/test_config.py
  function _expand_bids (line 30) | def _expand_bids(tmp_path, testdata_path, testcase):
  function test_bids_indexing_manifest (line 66) | def test_bids_indexing_manifest(tmp_path, testdata_path, testcase):

FILE: mriqc/tests/test_main.py
  function set_command (line 32) | def set_command(monkeypatch):
  function test_help (line 38) | def test_help(capsys):
  function test_main (line 45) | def test_main(tmp_path):

FILE: mriqc/tests/test_parser.py
  function _create_set_bids_dir (line 35) | def _create_set_bids_dir(args, _tmp_path):
  function test_parser_errors (line 48) | def test_parser_errors(args, code):
  function test_parser_valid (line 62) | def test_parser_valid(tmp_path, args):
  function test_verbosity_arg (line 79) | def test_verbosity_arg(tmp_path, argdest, argstr, argval):
  function test_species_arg (line 97) | def test_species_arg(tmp_path, argval, _species):

FILE: mriqc/tests/test_reports.py
  function test_anat_reports (line 39) | def test_anat_reports(tmp_path, testdata_path, outdir, dataset, subject):

FILE: mriqc/utils/bids.py
  function write_bidsignore (line 34) | def write_bidsignore(deriv_dir):
  function write_derivative_description (line 47) | def write_derivative_description(bids_dir, deriv_dir):
  function derive_bids_fname (line 103) | def derive_bids_fname(

FILE: mriqc/utils/debug.py
  function is_interactive (line 47) | def is_interactive():
  function setup_exceptionhook (line 54) | def setup_exceptionhook(ipython=False):

FILE: mriqc/utils/misc.py
  function worker (line 72) | async def worker(job: Callable[[], R], semaphore) -> R:
  function reorder_csv (line 78) | def reorder_csv(csv_file, out_file=None):
  function rotate_files (line 111) | def rotate_files(fname):
  function bids_path (line 132) | def bids_path(subid, sesid=None, runid=None, prefix=None, out_path=None,...
  function generate_pred (line 150) | def generate_pred(derivatives_dir, output_dir, mod):
  function generate_tsv (line 192) | def generate_tsv(output_dir, mod):
  function _read_and_save (line 227) | def _read_and_save(in_file):
  function _flatten (line 231) | def _flatten(in_dict, parent_key='', sep='_'):
  function _flatten_dict (line 242) | def _flatten_dict(indict):
  function _flatten_list (line 257) | def _flatten_list(xs):
  function _datalad_get (line 265) | def _datalad_get(input_list, nprocs=None):
  function _file_meta_and_size (line 294) | def _file_meta_and_size(
  function _extract_meta_and_size (line 374) | async def _extract_meta_and_size(
  function initialize_meta_and_data (line 425) | def initialize_meta_and_data(
  function _merge_entities (line 508) | def _merge_entities(

FILE: mriqc/utils/telemetry.py
  function setup_migas (line 6) | def setup_migas(init_ping: bool = True, exit_ping: bool = True) -> None:
  function send_crumb (line 30) | def send_crumb(**kwargs) -> dict:

FILE: mriqc/workflows/anatomical/base.py
  function anat_qc_workflow (line 77) | def anat_qc_workflow(name='anatMRIQC'):
  function spatial_normalization (line 249) | def spatial_normalization(name='SpatialNormalization'):
  function init_brain_tissue_segmentation (line 332) | def init_brain_tissue_segmentation(name='brain_tissue_segmentation'):
  function compute_iqms (line 420) | def compute_iqms(name='ComputeIQMs'):
  function headmsk_wf (line 536) | def headmsk_wf(name='HeadMaskWorkflow', omp_nthreads=1):
  function airmsk_wf (line 615) | def airmsk_wf(name='AirMaskWorkflow'):
  function _binarize (line 684) | def _binarize(in_file, threshold=0.5, out_file=None):
  function _enhance (line 706) | def _enhance(in_file, wm_tpm, out_file=None):
  function image_gradient (line 733) | def image_gradient(in_file, brainmask, sigma=4.0, out_file=None):
  function gradient_threshold (line 761) | def gradient_threshold(in_file, brainmask, thresh=15.0, out_file=None, a...
  function _get_imgtype (line 816) | def _get_imgtype(in_file):
  function _get_mod (line 822) | def _get_mod(in_file):
  function _pop (line 830) | def _pop(inlist):

FILE: mriqc/workflows/anatomical/output.py
  function init_anat_report_wf (line 32) | def init_anat_report_wf(name: str = 'anat_report_wf'):

FILE: mriqc/workflows/core.py
  function init_mriqc_wf (line 38) | def init_mriqc_wf():

FILE: mriqc/workflows/diffusion/base.py
  function dmri_qc_workflow (line 55) | def dmri_qc_workflow(name='dwiMRIQC'):
  function compute_iqms (line 314) | def compute_iqms(name='ComputeIQMs'):
  function hmc_workflow (line 440) | def hmc_workflow(name='dMRI_HMC'):
  function epi_mni_align (line 518) | def epi_mni_align(name='SpatialNormalization'):
  function _mean (line 657) | def _mean(inlist):
  function _parse_tqual (line 663) | def _parse_tqual(in_file):
  function _parse_tout (line 671) | def _parse_tout(in_file):
  function _tolist (line 678) | def _tolist(value):
  function _get_bvals (line 682) | def _get_bvals(bmatrix):
  function _first (line 688) | def _first(inlist):
  function _all_but_first (line 695) | def _all_but_first(inlist):
  function _estimate_sigma (line 702) | def _estimate_sigma(in_file, mask):
  function _bvals_report (line 713) | def _bvals_report(in_file):
  function _filter_metadata (line 724) | def _filter_metadata(

FILE: mriqc/workflows/diffusion/output.py
  function init_dwi_report_wf (line 36) | def init_dwi_report_wf(name='dwi_report_wf'):
  function _carpet_parcellation (line 221) | def _carpet_parcellation(segmentation, crown_mask):
  function _get_tr (line 246) | def _get_tr(meta_dict):
  function _get_wm (line 250) | def _get_wm(in_file, radius=2):

FILE: mriqc/workflows/functional/base.py
  function fmri_qc_workflow (line 54) | def fmri_qc_workflow(name='funcMRIQC'):
  function compute_iqms (line 263) | def compute_iqms(name='ComputeIQMs'):
  function fmri_bmsk_workflow (line 465) | def fmri_bmsk_workflow(name='fMRIBrainMask'):
  function hmc (line 495) | def hmc(name='fMRI_HMC', omp_nthreads=None):
  function epi_mni_align (line 612) | def epi_mni_align(name='SpatialNormalization'):
  function _parse_tqual (line 751) | def _parse_tqual(in_file):
  function _parse_tout (line 762) | def _parse_tout(in_file):
  function _apply_transforms (line 772) | def _apply_transforms(in_file, in_xfm, max_concurrent):

FILE: mriqc/workflows/functional/output.py
  function init_func_report_wf (line 32) | def init_func_report_wf(name='func_report_wf'):
  function spikes_mask (line 345) | def spikes_mask(in_file, in_mask=None, out_file=None):
  function _carpet_parcellation (line 403) | def _carpet_parcellation(segmentation, crown_mask):
  function _get_tr (line 428) | def _get_tr(meta_dict):

FILE: mriqc/workflows/shared.py
  function synthstrip_wf (line 29) | def synthstrip_wf(name='synthstrip_wf', omp_nthreads=None):

FILE: mriqc/workflows/utils.py
  function _tofloat (line 26) | def _tofloat(inlist):
  function fwhm_dict (line 32) | def fwhm_dict(fwhm):
  function thresh_image (line 43) | def thresh_image(in_file, thres=0.5, out_file=None):
  function spectrum_mask (line 65) | def spectrum_mask(size):
  function slice_wise_fft (line 92) | def slice_wise_fft(in_file, ftmask=None, spike_thres=3.0, out_prefix=None):
  function get_fwhmx (line 174) | def get_fwhmx():
  function generate_filename (line 187) | def generate_filename(in_file, dirname=None, suffix='', extension=None):
Condensed preview — 173 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,671K chars).
[
  {
    "path": ".circleci/circle_T1w.txt",
    "chars": 2440,
    "preview": ".bids_db\n.bids_db/layout_index.sqlite\n.bidsignore\ndataset_description.json\ngroup_T1w.html\ngroup_T1w.tsv\nlogs\nlogs/config"
  },
  {
    "path": ".circleci/circle_bold.txt",
    "chars": 7567,
    "preview": ".bids_db\n.bids_db/layout_index.sqlite\n.bidsignore\ndataset_description.json\ngroup_bold.html\ngroup_bold.tsv\nlogs\nlogs/conf"
  },
  {
    "path": ".circleci/config.yml",
    "chars": 30544,
    "preview": "version: 2.1\norbs:\n  docker: circleci/docker@2.1.4\n\njobs:\n  build:\n    environment:\n      - TZ: \"/usr/share/zoneinfo/Ame"
  },
  {
    "path": ".codecov.yml",
    "chars": 587,
    "preview": "codecov:\n  token: 507d37e9-5aac-4c1e-b28c-f2b4ef9d2edf\n  branch: master\n  bot: oesteban\n\ncoverage:\n  precision: 2\n  roun"
  },
  {
    "path": ".dockerignore",
    "chars": 851,
    "preview": "# python cache\n.cache/\n__pycache__/**/*\n__pycache__\n*.pyc\n\n# python distribution\nbuild/**/*\nbuild\ndist/**/*\ndist\nmriqc.e"
  },
  {
    "path": ".git_archival.txt",
    "chars": 125,
    "preview": "node: $Format:%H$\nnode-date: $Format:%cI$\ndescribe-name: $Format:%(describe:tags=true,match=*[0-9]*)$\nref-names: $Format"
  },
  {
    "path": ".gitattributes",
    "chars": 32,
    "preview": ".git_archival.txt  export-subst\n"
  },
  {
    "path": ".github/config.yml",
    "chars": 962,
    "preview": "# Comment to be posted to on pull requests merged by a first time user\nfirstPRMergeComment: >\n  Thanks for opening this "
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 122,
    "preview": "---\nversion: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly"
  },
  {
    "path": ".github/workflows/pythonpackage.yml",
    "chars": 3015,
    "preview": "# This workflow will install Python dependencies, run tests and lint with a variety of Python versions\n# For more inform"
  },
  {
    "path": ".gitignore",
    "chars": 842,
    "preview": "# setuptools-scm\nmriqc/_version.py\n\n.DS_Store\n\n# IDE configuration\n.idea/\n.vscode\n\n# Documentation build\ndocs/build\nbuil"
  },
  {
    "path": ".mailmap",
    "chars": 4143,
    "preview": "Aaron Piccirilli <apiccirilli@gmail.com>\nAdam Huffman <bloch@verdurin.com>\nAdam Huffman <bloch@verdurin.com> verdurin\nAd"
  },
  {
    "path": ".maint/CONTRIBUTORS.md",
    "chars": 4737,
    "preview": "# CONTRIBUTORS\n\nThis document lists those who have made contributions to the Project.\nAs per the contributor guidelines,"
  },
  {
    "path": ".maint/FORMER.md",
    "chars": 679,
    "preview": "# FORMER MEMBERS\n\nThis document lists former contributors or maintainers who want to disengage from the Project, and see"
  },
  {
    "path": ".maint/MAINTAINERS.md",
    "chars": 1496,
    "preview": "# Maintainers\n\nThis document lists the Maintainers of the project.\nMaintainers may be added once approved by the existin"
  },
  {
    "path": ".maint/PIs.md",
    "chars": 1443,
    "preview": "# PRINCIPAL INVESTIGATORS\n\nThis documents the key personnel who oversees the development of the Project and secures fund"
  },
  {
    "path": ".maint/ROADMAP.md",
    "chars": 642,
    "preview": "# ROADMAP\n\nThis document states how the roadmap is built, discussed and monitored by the Maintainers, with the engagemen"
  },
  {
    "path": ".maint/requirements.txt",
    "chars": 35,
    "preview": "click\nfuzzywuzzy\npython-Levenshtein"
  },
  {
    "path": ".maint/update_authors.py",
    "chars": 9612,
    "preview": "#!/usr/bin/env python3\n\"\"\"Update and sort the creators list of the zenodo record.\"\"\"\nimport json\nimport sys\nfrom pathlib"
  },
  {
    "path": ".maint/update_changes.sh",
    "chars": 960,
    "preview": "#!/bin/bash\n#\n# Collects the pull-requests since the latest release and\n# aranges them in the CHANGES.rst file.\n#\n# This"
  },
  {
    "path": ".readthedocs.yaml",
    "chars": 530,
    "preview": "# .readthedocs.yaml\n# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html f"
  },
  {
    "path": ".zenodo.json",
    "chars": 8571,
    "preview": "{\n  \"title\": \"MRIQC: Advancing the automatic prediction of image quality in MRI from unseen sites\",\n  \"description\": \"<p"
  },
  {
    "path": "AGENTS.md",
    "chars": 1796,
    "preview": "# Agent Instructions for Codex\n\n## Operating Principles\n1. **Always plan first.** Provide a brief plan before any change"
  },
  {
    "path": "CHANGES.rst",
    "chars": 73251,
    "preview": "25.0.0 (TBD)\n============\nA new 25.x series.\n\nCHANGES\n-------\n  * FIX: Decode bytes to produce a string (#1371)\n  * FIX:"
  },
  {
    "path": "Dockerfile",
    "chars": 8386,
    "preview": "# MRIQC Docker Container Image distribution\n#\n# MIT License\n#\n# Copyright (c) 2021 The NiPreps Developers\n#\n# Permission"
  },
  {
    "path": "Dockerfile_devel",
    "chars": 141,
    "preview": "FROM nipreps/mriqc:latest\nCOPY . /src/mriqc\nARG VERSION\nRUN export SETUPTOOLS_SCM_PRETEND_VERSION=$VERSION && pip instal"
  },
  {
    "path": "LICENSE",
    "chars": 11353,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "MANIFEST.in",
    "chars": 320,
    "preview": "#documentation\nrecursive-exclude .circleci/ *\nrecursive-exclude .github/ *\nrecursive-exclude .git/ *\nrecursive-exclude ."
  },
  {
    "path": "Makefile",
    "chars": 1320,
    "preview": "# Basic actions\n\nTEST_PATH = ./\nMRIQC_VERSION = latest\n\n\n.PHONY: clean-pyc\nclean-pyc:\n\t\tfind . -name '__pycache__' -type"
  },
  {
    "path": "README.rst",
    "chars": 6271,
    "preview": "mriqc: image quality metrics for quality assessment of MRI\n==========================================================\n\n|"
  },
  {
    "path": "docker/files/neurodebian.gpg",
    "chars": 4379,
    "preview": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v1\n\nmQGiBEQ7TOgRBADvaRsIZ3VZ6Qy7PlDpdMm97m0OfvouOj/HhjOM4M3ECbGn4cYh"
  },
  {
    "path": "docs/Makefile",
    "chars": 7710,
    "preview": "# Makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD "
  },
  {
    "path": "docs/notebooks/.gitignore",
    "chars": 82,
    "preview": ".ipynb_checkpoints/\nABIDE-BIDS/\ndata/\nexample_artifacts_dataset/\nout/\ntemp/\n*.svg\n"
  },
  {
    "path": "docs/notebooks/MRIQC Web API.ipynb",
    "chars": 217332,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Querying the MRIQC Web API\\n\",\n  "
  },
  {
    "path": "docs/notebooks/Paper-v1.0.ipynb",
    "chars": 14635,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"o"
  },
  {
    "path": "docs/notebooks/Paper-v2.0.ipynb",
    "chars": 23169,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Generation of tables and figures "
  },
  {
    "path": "docs/notebooks/SpikesPlotter.ipynb",
    "chars": 4669,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"o"
  },
  {
    "path": "docs/notebooks/Supplemental Materials.ipynb",
    "chars": 3731,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Generation of supplemental materi"
  },
  {
    "path": "docs/notebooks/finding_spikes.ipynb",
    "chars": 8709,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \""
  },
  {
    "path": "docs/source/_static/bold-1subject-1task.html",
    "chars": 40079,
    "preview": "<!DOCTYPE html>\n    <head>\n        <style>\n            #content{\n                width:99%;\n                height:100%;"
  },
  {
    "path": "docs/source/_static/bold-1subject-8tasks.html",
    "chars": 299953,
    "preview": "<!DOCTYPE html>\n    <head>\n        <style>\n            #content{\n                width:99%;\n                height:100%;"
  },
  {
    "path": "docs/source/_static/example_funcreport.html",
    "chars": 30817,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.or"
  },
  {
    "path": "docs/source/about.rst",
    "chars": 75,
    "preview": "Introduction\n************\n\n.. include:: ../../README.rst\n   :start-line: 3\n"
  },
  {
    "path": "docs/source/changes.rst",
    "chars": 54,
    "preview": "What's new\n**********\n\n.. include:: ../../CHANGES.rst\n"
  },
  {
    "path": "docs/source/conf.py",
    "chars": 10444,
    "preview": "\"\"\"\nmriqc documentation build configuration file, created by\nsphinx-quickstart on Thu Feb 25 09:31:58 2016.\n\nThis file i"
  },
  {
    "path": "docs/source/dsa.rst",
    "chars": 4124,
    "preview": "\n.. _dsa:\n\nData Sharing Agreement\n**********************\nFoundations\n-----------\n(Text in this section has been retrieve"
  },
  {
    "path": "docs/source/index.rst",
    "chars": 397,
    "preview": "Welcome to *MRIQC*'s documentation!\n###################################\n\n.. include:: ../../README.rst\n   :start-line: 3"
  },
  {
    "path": "docs/source/install.rst",
    "chars": 4486,
    "preview": "\nInstalling *MRIQC*\n******************\n*MRIQC* is a *NiPreps* (`www.nipreps.org <https://nipreps.org>`__)\n*BIDS App* [BI"
  },
  {
    "path": "docs/source/iqms/bold.rst",
    "chars": 163,
    "preview": ".. _iqms_bold:\n\nIQMs for functional images\n==========================\n.. automodule:: mriqc.qc.functional\n    :members:\n"
  },
  {
    "path": "docs/source/iqms/dwi.rst",
    "chars": 159,
    "preview": ".. _iqms_dwi:\n\nIQMs for diffusion images\n=========================\n.. automodule:: mriqc.qc.diffusion\n    :members:\n    "
  },
  {
    "path": "docs/source/iqms/t1w.rst",
    "chars": 162,
    "preview": ".. _iqms_t1w:\n\nIQMs for structural images\n==========================\n.. automodule:: mriqc.qc.anatomical\n    :members:\n "
  },
  {
    "path": "docs/source/license.rst",
    "chars": 1276,
    "preview": "About the *NiPreps* framework licensing\n***************************************\nPlease check https://www.nipreps.org/com"
  },
  {
    "path": "docs/source/measures.rst",
    "chars": 157,
    "preview": "\n.. _measures:\n\nImage Quality Metrics (IQMs)\n****************************\n\n.. automodule:: mriqc.qc\n    :members:\n    :u"
  },
  {
    "path": "docs/source/reports/bold.rst",
    "chars": 3568,
    "preview": "\n.. _reports-bold:\n\nBOLD images\n===========\nOne individual report per input functional timeseries will be generated\nin t"
  },
  {
    "path": "docs/source/reports/group.rst",
    "chars": 1491,
    "preview": ".. _reports-group:\n\nGroup reports\n=============\nOnce a sample has been processed with the appropriate\n:ref:`workflow <wo"
  },
  {
    "path": "docs/source/reports/smri.rst",
    "chars": 2086,
    "preview": ".. _reports-smri:\n\nT1 and T2 -weighed images\n=========================\nOne individual report per input structural volume"
  },
  {
    "path": "docs/source/reports.rst",
    "chars": 749,
    "preview": "\n.. _reports:\n\nVisual Reports\n**************\nDemo: anatomical reports\n------------------------\n.. raw:: html\n\n    <ifram"
  },
  {
    "path": "docs/source/resources/mriqc.sbatch",
    "chars": 4050,
    "preview": "#!/bin/bash\n\n# NOTE: To use this script, edit lines 17, 26, 40, 55, 56, 58\n # labeled TODO with NOTES explaining how. \n\n"
  },
  {
    "path": "docs/source/resources/sbatch.sh",
    "chars": 1048,
    "preview": "#!/bin/bash\n#\n#SBATCH -J mriqc\n#SBATCH --array=1-13\n#SBATCH --time=136:00:00\n#SBATCH -n 1\n#SBATCH --cpus-per-task=16\n#SB"
  },
  {
    "path": "docs/source/usage.rst",
    "chars": 6631,
    "preview": "\n.. _running_mriqc:\n\nRunning *MRIQC*\n***************\n*MRIQC* is a `BIDS-App <http://bids-apps.neuroimaging.io/>`_ [BIDSA"
  },
  {
    "path": "docs/source/workflows.rst",
    "chars": 127,
    "preview": "\n.. _workflows:\n\nWorkflows\n*********\n\n.. automodule:: mriqc.workflows\n    :members:\n    :undoc-members:\n    :show-inheri"
  },
  {
    "path": "long_description.rst",
    "chars": 224,
    "preview": "MRIQC provides a series of image processing workflows\nto extract and compute a series of NR (no-reference), IQMs\n(image "
  },
  {
    "path": "mriqc/__init__.py",
    "chars": 1333,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/__main__.py",
    "chars": 1162,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/_warnings.py",
    "chars": 4278,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/bin/__init__.py",
    "chars": 912,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/bin/abide2bids.py",
    "chars": 5842,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/bin/dfcheck.py",
    "chars": 5860,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/bin/fs2gif.py",
    "chars": 9117,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/bin/labeler.py",
    "chars": 3118,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/bin/messages.py",
    "chars": 2610,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/bin/mriqcwebapi_test.py",
    "chars": 2322,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/bin/nib_hash.py",
    "chars": 2054,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/bin/subject_wrangler.py",
    "chars": 5178,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/cli/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "mriqc/cli/parser.py",
    "chars": 22421,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/cli/run.py",
    "chars": 10531,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/cli/version.py",
    "chars": 3279,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/cli/workflow.py",
    "chars": 2030,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/config.py",
    "chars": 28939,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/conftest.py",
    "chars": 2444,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/data/NOTICE",
    "chars": 635,
    "preview": "MRIQC\nCopyright © The NiPreps Developers.\n\nThis product includes software developed by\nthe NiPreps Community (https://ni"
  },
  {
    "path": "mriqc/data/__init__.py",
    "chars": 1072,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/data/bootstrap-anat.yml",
    "chars": 4826,
    "preview": "# Copyright 2023 The NiPreps Developers <nipreps@gmail.com>\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "mriqc/data/bootstrap-dwi.yml",
    "chars": 3468,
    "preview": "# Copyright 2023 The NiPreps Developers <nipreps@gmail.com>\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "mriqc/data/bootstrap-func.yml",
    "chars": 4189,
    "preview": "# Copyright 2023 The NiPreps Developers <nipreps@gmail.com>\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "mriqc/data/config-example.toml",
    "chars": 1517,
    "preview": "[environment]\ncpu_count = 8\nexec_env = \"posix\"\nfree_mem = 10.8\novercommit_policy = \"heuristic\"\novercommit_limit = \"50%\"\n"
  },
  {
    "path": "mriqc/data/config.py",
    "chars": 1962,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/data/fsexport.tcl",
    "chars": 2936,
    "preview": "# Sample script for setting up and taking screen shots. Scripting\n# reference is available at:\n\n# https://surfer.nmr.mgh"
  },
  {
    "path": "mriqc/data/itk_identity.tfm",
    "chars": 113,
    "preview": "#Insight Transform File V1.0\n#Transform 0\nTransform: IdentityTransform_double_3_3\nParameters: \nFixedParameters: \n"
  },
  {
    "path": "mriqc/data/reports/embed_resources/boxplots.css",
    "chars": 2780,
    "preview": "/* Hide data table */\n.csvdata {\n    display: none;\n}\n\nbody {\n    font-family: helvetica;\n}\n\n.text-warning {\n    font-we"
  },
  {
    "path": "mriqc/data/reports/embed_resources/boxplots.js",
    "chars": 68147,
    "preview": "/**\n * @fileOverview A D3 based distribution chart system. Supports: Box plots, Violin plots, Notched box plots, trend l"
  },
  {
    "path": "mriqc/data/reports/group.html",
    "chars": 3134,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.or"
  },
  {
    "path": "mriqc/data/reports/resources/DO_NOT_REMOVE_OR_MODIFY",
    "chars": 126,
    "preview": "Do not remove or modify the files in this folder. They are being served from\ngithub to render group level reports in a v"
  },
  {
    "path": "mriqc/data/reports/resources/boxplots.css",
    "chars": 2780,
    "preview": "/* Hide data table */\n.csvdata {\n    display: none;\n}\n\nbody {\n    font-family: helvetica;\n}\n\n.text-warning {\n    font-we"
  },
  {
    "path": "mriqc/data/reports/resources/boxplots.js",
    "chars": 67967,
    "preview": "/**\n * @fileOverview A D3 based distribution chart system. Supports: Box plots, Violin plots, Notched box plots, trend l"
  },
  {
    "path": "mriqc/data/testdata/group_T1w.tsv",
    "chars": 5253,
    "preview": "bids_name\tcjv\tcnr\tefc\tfber\tfwhm_avg\tfwhm_x\tfwhm_y\tfwhm_z\ticvs_csf\ticvs_gm\ticvs_wm\tinu_med\tinu_range\tqi_1\tqi_2\trpve_csf\tr"
  },
  {
    "path": "mriqc/data/testdata/group_bold.tsv",
    "chars": 4802,
    "preview": "bids_name\taor\taqi\tdummy_trs\tdvars_nstd\tdvars_std\tdvars_vstd\tefc\tfber\tfd_mean\tfd_num\tfd_perc\tfwhm_avg\tfwhm_x\tfwhm_y\tfwhm_"
  },
  {
    "path": "mriqc/data/tests/ds000005/CHANGES",
    "chars": 216,
    "preview": "2.0.1 2016-10-21\n  \n  - Added authors to dataset_discription.json\n\n1.0.1 2016-02-18\n\n  -  Update orientation information"
  },
  {
    "path": "mriqc/data/tests/ds000005/README",
    "chars": 1013,
    "preview": "This dataset was obtained from the OpenfMRI project (http://www.openfmri.org).\nAccession #: ds005\nDescription: Mixed-gam"
  },
  {
    "path": "mriqc/data/tests/ds000005/dataset_description.json",
    "chars": 835,
    "preview": "{\n    \"BIDSVersion\": \"1.0.0rc4\",\n    \"License\": \"This dataset is made available under the Public Domain Dedication and L"
  },
  {
    "path": "mriqc/data/tests/ds000005/participants.tsv",
    "chars": 215,
    "preview": "participant_id\tsex\tage\nsub-01\tM\t28\nsub-02\tF\t21\nsub-03\tF\t27\nsub-04\tM\t25\nsub-05\tF\t20\nsub-06\tM\t20\nsub-07\tF\t24\nsub-08\tM\t25\ns"
  },
  {
    "path": "mriqc/data/tests/ds000005/sub-01/func/sub-01_task-mixedgamblestask_run-01_bold.json",
    "chars": 22,
    "preview": "{\n\t\"EchoTime\": 0.030\n}"
  },
  {
    "path": "mriqc/data/tests/ds000005/sub-01/func/sub-01_task-mixedgamblestask_run-01_events.tsv",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "mriqc/data/tests/ds000005/sub-01/func/sub-01_task-mixedgamblestask_run-02_events.tsv",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "mriqc/data/tests/ds000005/sub-01/func/sub-01_task-mixedgamblestask_run-03_events.tsv",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "mriqc/data/tests/ds000005/task-mixedgamblestask_bold.json",
    "chars": 67,
    "preview": "{\n    \"RepetitionTime\": 2.0,\n    \"TaskName\": \"mixed-gambles task\"\n}"
  },
  {
    "path": "mriqc/data/tests/ds002785/dataset_description.json",
    "chars": 623,
    "preview": "{\n    \"Name\": \"MRIQC - MRI Quality Control\",\n    \"BIDSVersion\": \"1.4.0\",\n    \"DatasetType\": \"derivative\",\n    \"Generated"
  },
  {
    "path": "mriqc/data/tests/ds002785/sub-0017/anat/sub-0017_T1w.json",
    "chars": 3433,
    "preview": "{\n  \"bids_meta\": {\n    \"AcquisitionNumber\": 4,\n    \"BidsifyVersion\": \"0.3.5\",\n    \"ConversionSoftware\": \"dcm2niix\",\n    "
  },
  {
    "path": "mriqc/data/tests/ds002785/sub-0042/anat/sub-0042_T1w.json",
    "chars": 3457,
    "preview": "{\n  \"bids_meta\": {\n    \"AcquisitionNumber\": 4,\n    \"BidsifyVersion\": \"0.3.5\",\n    \"ConversionSoftware\": \"dcm2niix\",\n    "
  },
  {
    "path": "mriqc/data/tests/gh1086-ds004134.oracle",
    "chars": 4,
    "preview": "182\n"
  },
  {
    "path": "mriqc/data/tests/gh921-dmd-20220428-0.oracle",
    "chars": 1,
    "preview": "0"
  },
  {
    "path": "mriqc/data/tests/gh921-dmd-20230319-0.oracle",
    "chars": 2,
    "preview": "13"
  },
  {
    "path": "mriqc/engine/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "mriqc/engine/plugin.py",
    "chars": 23662,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/instrumentation/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "mriqc/instrumentation/__main__.py",
    "chars": 1618,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/instrumentation/resources.py",
    "chars": 6962,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/instrumentation/viz.py",
    "chars": 2812,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/interfaces/__init__.py",
    "chars": 1676,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/interfaces/anatomical.py",
    "chars": 18113,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/interfaces/bids.py",
    "chars": 7284,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/interfaces/common/__init__.py",
    "chars": 1054,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/interfaces/common/conform_image.py",
    "chars": 7311,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/interfaces/common/ensure_size.py",
    "chars": 6317,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/interfaces/diffusion.py",
    "chars": 48295,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/interfaces/functional.py",
    "chars": 19264,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/interfaces/reports.py",
    "chars": 2665,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/interfaces/synthstrip.py",
    "chars": 2471,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/interfaces/tests/test_interfaces.py",
    "chars": 1601,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/interfaces/transitional.py",
    "chars": 2842,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/interfaces/webapi.py",
    "chars": 9399,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/messages.py",
    "chars": 3007,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/qc/__init__.py",
    "chars": 3151,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/qc/anatomical.py",
    "chars": 23478,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/qc/diffusion.py",
    "chars": 12914,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/qc/functional.py",
    "chars": 9368,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/qc/tests/__init__.py",
    "chars": 879,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/qc/tests/test_anatomical.py",
    "chars": 3684,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/qc/tests/test_diffusion.py",
    "chars": 1325,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/reports/__init__.py",
    "chars": 2054,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/reports/group.py",
    "chars": 11334,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/reports/individual.py",
    "chars": 3934,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/synthstrip/ORIGINAL_LICENSE",
    "chars": 10297,
    "preview": "         FreeSurfer Software License Agreement (\"Agreement\")\n                    Version 1.0 (February 2011)\n\nThis Agree"
  },
  {
    "path": "mriqc/synthstrip/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "mriqc/synthstrip/__main__.py",
    "chars": 1179,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/synthstrip/cli.py",
    "chars": 8044,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/synthstrip/model.py",
    "chars": 6523,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/testing.py",
    "chars": 1769,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/tests/test_config.py",
    "chars": 2705,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/tests/test_main.py",
    "chars": 1747,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/tests/test_parser.py",
    "chars": 2647,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/tests/test_reports.py",
    "chars": 2234,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/utils/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "mriqc/utils/bids.py",
    "chars": 6203,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/utils/debug.py",
    "chars": 2806,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/utils/misc.py",
    "chars": 15851,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/utils/telemetry.py",
    "chars": 1040,
    "preview": "import migas\n\nfrom .. import __version__, config\n\n\ndef setup_migas(init_ping: bool = True, exit_ping: bool = True) -> No"
  },
  {
    "path": "mriqc/workflows/__init__.py",
    "chars": 1276,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/workflows/anatomical/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "mriqc/workflows/anatomical/base.py",
    "chars": 28749,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/workflows/anatomical/output.py",
    "chars": 8705,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/workflows/core.py",
    "chars": 1991,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/workflows/diffusion/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "mriqc/workflows/diffusion/base.py",
    "chars": 24175,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/workflows/diffusion/output.py",
    "chars": 8586,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/workflows/functional/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "mriqc/workflows/functional/base.py",
    "chars": 26288,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/workflows/functional/output.py",
    "chars": 14010,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/workflows/shared.py",
    "chars": 3157,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "mriqc/workflows/utils.py",
    "chars": 7440,
    "preview": "# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-\n# vi: set ft=python sts=4 ts=4 sw=4 et:\n#\n# Co"
  },
  {
    "path": "pyproject.toml",
    "chars": 5075,
    "preview": "[build-system]\nrequires = [\"hatchling>=1.27\", \"hatch-vcs\", \"nipreps-versions\"]\nbuild-backend = \"hatchling.build\"\n\n[proje"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the nipreps/mriqc GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 173 files (17.6 MB), approximately 570.4k tokens, and a symbol index with 371 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!