Getting Started

Install for development

Clone the repository, then install the editable package and development dependencies:

uv sync --group dev

This installs KinePET from source and builds the compiled nanobind extension used by the Python API.

Source installs require:

  • Python supported by the project
  • uv
  • CMake
  • a C++20 compiler toolchain

The Python API imports the compiled _core extension, so CMake is required for source installs even if you do not plan to use the standalone CLI. If you install a prebuilt wheel, CMake should not be needed because the extension is already compiled.

First batch fit

fit_tacs() expects:

  • tacs: shape (T, N)
  • time: shape (T,), (T, 1), or (T, N)
  • aif: shape (T,), (T, 1), or (T, N)

When aif is (T, N), time must also be (T, N) so each TAC is fitted with its matching AIF and sample-time column.

import numpy as np
import kinepet

time = np.array([0.0, 0.0833, 0.1667, 0.25, 0.5, 1.0, 2.0, 5.0, 10.0, 20.0, 40.0])
aif = 12.0 * np.exp(-time / 0.35) + 1.5 * np.exp(-time / 8.0)

tacs = np.stack(
    [
        kinepet.evaluate_model(time, aif, model="irr", K1=0.10, k2=0.12, k3=0.06, vB=0.04),
        kinepet.evaluate_model(time, aif, model="irr", K1=0.14, k2=0.18, k3=0.08, vB=0.06),
    ],
    axis=1,
)

fit = kinepet.fit_tacs(tacs, time, aif, model="irr", threads=2)

print(fit.K1)
print(fit.k2)
print(fit.k3)
print(fit.vB)
print(fit.status)

fit is a BatchFitResult. Each fitted parameter is a one-dimensional NumPy array with shape (N,).

Build the CLI

The CLI is built from the same CMake project:

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

Then run:

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

See CLI for accepted inputs, options, and output files.