# Data-generating model shared by make_data.py and simulation.py. Python 3.13, NumPy.
# Clonogenic assay: colonies counted in 3 dishes per dose (0, 2, 4, 6 Gy), with and without a radiosensitiser, in several
# independent experiments. Survival follows the linear-quadratic model SF = exp(-(alpha D + beta D^2)).
import numpy as np
DOSES = np.array([0, 2, 4, 6.0]); SEEDED = np.array([200, 400, 1000, 3000]); DISHES = 3

def experiment(rng, alpha_ratio=1.0, alpha=0.30, beta=0.03, sd_pe=0.15, sd_alpha=0.12, sd_dish=0.10):
    """Rows (condition, dose, dish, seeded, colonies). Plating efficiency varies by experiment and condition; alpha varies
    between experiments (and a little between conditions); dishes scatter around the expected count."""
    rows = []; day = rng.normal(0, sd_alpha)
    for cond, ar in (("control", 1.0), ("sensitiser", alpha_ratio)):
        pe = 0.6 * np.exp(rng.normal(0, sd_pe)); a = alpha * ar * np.exp(day + rng.normal(0, sd_alpha / 2))
        for d, s in zip(DOSES, SEEDED):
            mu = s * pe * np.exp(-(a * d + beta * d ** 2))
            for k in range(DISHES):
                rows.append((cond, d, k + 1, s, rng.poisson(mu * np.exp(rng.normal(0, sd_dish)))))
    return rows
