Batch Fitting

Use kinepet.fit_tacs() for the main TAC-batch workflow.

fit = kinepet.fit_tacs(
    tacs,
    time,
    aif,
    weights=None,
    model="rev",
    fit_vb=True,
    fixed_vb=0.05,
    fit_delay=False,
    fixed_delay=0.0,
    fit_dispersion=False,
    fixed_dispersion=0.0,
    threads=0,
    max_iterations=40,
    gradient_tolerance=1e-6,
    step_tolerance=1e-6,
    cost_tolerance=1e-9,
    fd_step=1e-4,
    lambda_initial=1e-2,
    use_linear_warm_start=True,
)

Inputs

Argument Shape or type Description
tacs (T, N) TAC matrix. Each column is one TAC.
time (T,), (T, 1), or (T, N) Frame times. Values are interpreted as minutes unless max(time) > 60, in which case seconds are converted internally.
aif (T,), (T, 1), or (T, N) Arterial input function. A vector or single-column array is shared by all TACs. (T, N) provides one AIF per TAC and requires time to also be (T, N).
weights None, (T,), (T, 1), or (T, N) Optional residual weights. Shared and per-TAC semantics match aif.
model "irr" or "rev" Kinetic model name.
threads int OpenMP thread count when available. 0 lets the backend choose.

Shared and per-TAC timing

For a shared AIF, pass a shared time vector:

fit = kinepet.fit_tacs(tacs, time, aif, model="rev")

For per-TAC AIFs, pass per-TAC times:

fit = kinepet.fit_tacs(
    tacs,
    time_matrix,  # shape (T, N)
    aif_matrix,   # shape (T, N)
    model="rev",
)

In the per-TAC case, column i is fitted as time_matrix[:, i], aif_matrix[:, i], and tacs[:, i].

Optional fitted parameters

By default KinePET fits vB, does not fit delay, and does not fit dispersion.

Option Default Meaning
fit_vb True Fit blood volume fraction.
fixed_vb 0.05 Used when fit_vb=False.
fit_delay False Fit AIF delay in minutes.
fixed_delay 0.0 Used when fit_delay=False.
fit_dispersion False Fit AIF dispersion in minutes.
fixed_dispersion 0.0 Used when fit_dispersion=False. Must be non-negative.

Delay and dispersion are available, but simultaneous estimation can be less stable than fitting the core kinetic parameters on difficult curves.

Return value

fit_tacs() returns BatchFitResult. Parameter arrays are flat (N,) arrays:

fit = kinepet.fit_tacs(tacs, time, aif, model="rev")

print(fit.K1)
print(fit.k2)
print(fit.k3)
print(fit.k4)
print(fit.vB)
print(fit.Ki)
print(fit.rmse)
print(fit.status)

For model="irr", fit.k4 is None. fit.delay and fit.dispersion are also None unless the corresponding parameter is fitted or fixed to a nonzero value.

Use as_dict() when you want to iterate over returned fields:

arrays = fit.as_dict()

for name, value in arrays.items():
    print(name, value)