CLI

The standalone CLI is tcm_fit_tacs. It fits .npy TAC-batch directories.

Build from source

Install development dependencies:

uv sync --group dev

uv sync --group dev already builds the Python extension through CMake. To build the standalone CLI target as well, run CMake explicitly:

cmake -S . -B build -DPython_EXECUTABLE=$(uv run python -c 'import sys; print(sys.executable)')
cmake --build build

Source builds require CMake and a C++20 compiler. These are needed for the Python extension as well as the CLI.

Run

./build/tcm_fit_tacs --input-dir INPUT --output-dir OUTPUT --model rev --threads 8

Input directory:

INPUT/
  tacs.npy
  time.npy
  aif.npy

time.npy may be (T,), (T, 1), or (T, N). If aif.npy is (T, N), time.npy must also be (T, N) so each TAC column is fitted with its matching AIF and sample times.

Optional weights can be passed with --weights-file:

./build/tcm_fit_tacs \
  --input-dir INPUT \
  --output-dir OUTPUT \
  --model irr \
  --weights-file INPUT/weights.npy

Options

Option Description
--input-dir DIR Directory containing tacs.npy, time.npy, and aif.npy.
--output-dir DIR Directory for result files.
--model rev\|irr Model to fit.
--fit-vb 0\|1 Fit blood volume fraction. Default: 1.
--fixed-vb VALUE Fixed blood volume when --fit-vb 0. Default: 0.05.
--fit-delay 0\|1 Fit AIF delay. Default: 0.
--fixed-delay VALUE Fixed AIF delay in minutes when delay is not fitted. Default: 0.0.
--fit-dispersion 0\|1 Fit AIF dispersion. Default: 0.
--fixed-dispersion VALUE Fixed AIF dispersion in minutes when dispersion is not fitted. Default: 0.0.
--threads N OpenMP threads when available.
--max-iter N Maximum trust-region iterations. Default: 40.
--weights-file PATH Optional .npy weights array.
--no-linear-warm-start Disable linear least-squares initialization.

Output files

The CLI writes flat (N,) arrays:

File Availability
K1.npy Always
k2.npy Always
k3.npy Always
k4.npy rev only
vB.npy Always
delay.npy When delay is fitted or fixed to a nonzero value
dispersion.npy When dispersion is fitted or fixed to a nonzero value
Ki.npy Always
rmse.npy Always
iterations.npy Always
status.npy Always, numeric status codes
run.txt Manifest for the run

status.npy contains numeric status codes. See Results and Status for the status table.