# groei.py - de groeicurve van een bacteriecultuur: een eenvoudig model (stap van 1 minuut)
import math

MU_MAX = math.log(2) / (20 / 60)   # per uur: E. coli bij 37 graden verdubbelt elke 20 minuten
N_MAX = 1e9                        # bacteriën per mL als al het voedsel op is
AANLOOP = 1.5                      # uur om zich aan te passen (aanloopfase)
STERFTE = 0.2                      # per uur, als de honger lang genoeg duurt


def groeicurve(n0=1e3, uren=48, dt=1 / 60):
    """Geeft een lijst (t in uur, N per mL) terug."""
    n, voedsel, honger = n0, 1.0, 0.0            # voedsel: 1 = vol, 0 = op
    klaar_q = 1 / (math.exp(MU_MAX * AANLOOP) - 1)
    punten = [(0.0, n)]
    for stap in range(1, round(uren / dt) + 1):
        klaar = klaar_q / (1 + klaar_q)           # 0 bij de start, 1 als de cel is aangepast
        mu = MU_MAX * klaar * voedsel / (0.05 + voedsel)
        erbij = mu * n * dt                       # nieuwe bacteriën in deze stap
        voedsel = max(0.0, voedsel - erbij / N_MAX)
        klaar_q = klaar_q * math.exp(MU_MAX * dt)
        if voedsel < 0.01:
            honger += dt                          # hoe lang is het voedsel al op?
        sterf = STERFTE * min(1.0, honger / 16) ** 2 * n * dt
        n = n + erbij - sterf
        punten.append((stap * dt, n))
    return punten


if __name__ == "__main__":
    curve = groeicurve()
    print("  t (h)    N per mL    log N")
    for t, n in curve[::180]:                     # elke 3 uur
        print(f"{t:6.0f}   {n:10.2e}   {math.log10(n):5.2f}")
    top_t, top_n = max(curve, key=lambda p: p[1])
    print(f"hoogste waarde {top_n:.2e} per mL na {top_t:.1f} h")
