# Python
__pycache__/
*.pyc
.pytest_cache/
.venv/
venv/
build/
dist/
*.egg-info/

# Local scratch
/tmp
# assembled preview site (symlinks to web/ + results/ + docs/), mirrors the pages.yml layout
.site/
*.log
figures/
out/
.sweep/

# Per-run scoring scratch: only the small aggregated result files are tracked: results/index.json
# (Pages reads it, score.yml commits it), results/repro.json (the harmonization reproducibility
# stats read by the repro dataset views; repro.yml commits it), and results/repro_regions.json (the
# compact per-run regional aggregate the harmonization Findings figures read). Everything else under
# results/ is per-run recon/truth/error/resources scratch (incl. the large repro_rois.json).
/results/*
!/results/index.json
!/results/repro.json
!/results/repro_regions.json
# score.yml's merge job commits scoring-state.json too: what was scored at which SHA (score_state.py).
!/results/scoring-state.json

# Held-out ground truth + generated/downloaded datasets must never be committed
data/**/groundtruth/
data/*/dev/
data/*/scoring/
gt/

# Pipeline runner scratch
.work/

# OSF dataset cache + any local token (secret — never commit)
.osfcache/
*osf*.txt
qsm-ci-osf.txt

# NIfTI volumes are build artifacts (datasets, and per-run viewer volumes) — never committed
*.nii
*.nii.gz

# local static-site serving symlink
web/results

# Claude Code agent worktrees / local scratch — never belong in the repo. (14 stray gitlink
# submodule entries under .claude/worktrees/ leaked in via PR #49 and made every git operation
# emit "fatal: No url found for submodule"; removed and ignored here.)
.claude/

# OS
.DS_Store
algorithms/_qsmxt/qsmxt
web/docs

# Compiled MATLAB artifacts (build locally; the binary ships in the MCR image, not git)
algorithms/*/recon
algorithms/*/run_recon.sh
algorithms/*/readme.txt
algorithms/*/mccExcludedFiles.log
algorithms/*/requiredMCRProducts.txt
algorithms/*/unresolvedSymbols.txt
algorithms/*/includedSupportPackages.txt
algorithms/*/buildresult.json
algorithms/*/nifti/
algorithms/*/medi/
algorithms/*/sti/
algorithms/*/sti_support/
# Compiled-MATLAB submissions ship as prebuilt+pushed GHCR images (the Dockerfile bakes a
# licensed mcc binary that CI cannot reproduce), so CI must PULL image: rather than build the
# Dockerfile. The runner never builds one anyway — qsm_ci/containers._build_oci only pulls `image:` —
# so a folder Dockerfile is just the recipe for the pushed image; it stays out of the checkout and
# is documented in each submission's BUILD.md instead. Explicit list (the former matlab-* folders):
algorithms/tkd-qsmci/Dockerfile
algorithms/ilsqr-sti/Dockerfile
algorithms/star-sti/Dockerfile
algorithms/vsharp-sti/Dockerfile
algorithms/medi-cornell/Dockerfile
# IR2QSM: a baked pretrained checkpoint CI cannot reproduce (the authors' single-file Drive link is
# quota-blocked). Same rule: CI PULLs the pushed image, so keep its Dockerfile out of the checkout.
# (The compiled-MATLAB FANSI/NDI/L1-QSM/WH-QSM/HD-QSM submissions once listed here were replaced by
# QSM.rs ports — fansi-*-qsmrs, ndi-qsmrs, l1qsm-qsmrs, whqsm-qsmrs, hdqsm-qsmrs — which run on the
# shared qsmxt image with no Dockerfile.)
algorithms/ir2qsm/Dockerfile
# AMP-PE: the upstream MIT solver (amp_pe_qsm/, functions/) is a build-time dep fetched via
# git clone and baked into the compiled recon binary (see BUILD.md), so it isn't committed; its
# Dockerfile is gitignored too so CI pulls the prebuilt MCR image.
algorithms/amp-pe/Dockerfile
algorithms/amp-pe/amp_pe_qsm/
algorithms/amp-pe/functions/

# Large network weights are build-time deps (fetched at build), never committed.
algorithms/*/*.mat
algorithms/*/*.pth
algorithms/*/*.onnx
algorithms/chisepnet/Dockerfile
algorithms/susep-net/Dockerfile
# r2primenet: SNU toolbox weights baked into the pushed image (see its BUILD.md); Dockerfile
# gitignored so CI pulls the prebuilt image. (*.onnx / *.mat already ignored above.)
algorithms/r2primenet/Dockerfile
# r2primenet-7t: same delivery (public checkpoint, academic-use notice; ONNX baked into the image).
algorithms/r2primenet-7t/Dockerfile

# WaveSep: third-party source (no license; author permission for academic use only) is baked into the
# image, not redistributed in the repo. Its Dockerfile is gitignored too so CI pulls the prebuilt image.
algorithms/wavesep/wavesep/
algorithms/wavesep/Dockerfile

# chi-separation MATLAB methods: the SNU-LIST chi-separation toolbox (obtained via Google Form, academic
# use) is a build-time dep baked into the compiled recon binary, never committed. shims/ IS committed
# (ours). Dockerfiles gitignored so CI pulls the prebuilt MCR image (see each BUILD.md).
algorithms/*/chisep/
algorithms/chisep-ilsqr/Dockerfile
algorithms/chisep-medi/Dockerfile
algorithms/decompose-qsm/Dockerfile

# QSMART (original toolbox): third-party build-time deps (QSMART .m files + Hongfu Sun's
# lapunwrap, Frangi filter + curvatures File Exchange code) are fetched at build and baked
# into the compiled recon binary, never committed (nifti/ and sti/ already ignored above).
# shims/ IS committed (ours). Dockerfile gitignored so CI pulls the prebuilt MCR+ANTs image
# (see algorithms/qsmart-matlab/BUILD.md).
algorithms/qsmart-matlab/qsmart/
algorithms/qsmart-matlab/frangi/
algorithms/qsmart-matlab/curvatures/
algorithms/qsmart-matlab/Dockerfile

# nipype crash dumps from local interface tests
crash-*.pklz
