A mechanistic simulator of cultured cells under drug, with its errors measured.
Each simulated cell runs a cell-cycle oscillator, the ATM/p53/MDM2 damage response and the intrinsic apoptotic cascade, driven by the drug concentration inside it. Run them well-mixed and a dose-response curve is one simulation; run them on a lattice and a spheroid grows a hypoxic rim and a necrotic core.
These runs are simulated fresh each time the site is deployed, so they show what the current code produces — not a recording.
The cell simulator needs only NumPy and SciPy:
pip install cellsim
cellsim cell-sim --line A549 --drug cisplatin --hours 72
cellsim dish --line DLD-1 --geometry spheroid --hours 120 \
--cells 3000 --grid 48 --every 8 --out spheroid.jsonl
Then open spheroid.jsonl with the viewer's “Open .jsonl” button.
In a notebook:
from cellsim.api import curve, exposure, washout, spheroid
exposure("A549", "paclitaxel") # concentration needed for half kill
# at each exposure time
It answers questions within a cell line, where the mechanism carries the weight: whether to pulse a drug or hold it, how long a culture takes to recover after wash-out, whether two drugs antagonise, what a schedule selects for, how deep a drug reaches into an aggregate.
It does not predict which cell line is more sensitive. That was measured to be unreachable from the available markers — eleven of them, fitted optimally across 156–683 cell lines, explain 9–20 % of the difference between lines — so it is stated as out of scope rather than attempted.
Every fitted quantity is named and counted: one potency constant per drug, one spatial constant for the dish. Everything else is a literature input cited where it is used. Predictions are compared against public measurements, and the misses are published beside the passes — including two results withdrawn during development when re-measuring showed one rested on a single surviving lineage and the other on one random seed.