CellSim

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.

Run an experiment in your browser

Open the Lab → Pick cells and a drug, knock out a gene, change the schedule, press Run. The real engine runs on your own machine — nothing to install, nothing uploaded. The first visit downloads about 40 MB and takes a minute or two to start; after that, about half a minute per experiment.

Watch inside one cell → Every molecule the engine tracks, minute by minute, as a cell divides, stops or dies. Look up any drug by name or structure, or design your own and watch what it does.

Open a run in the viewer

Empty viewerdrop your own .jsonl or .jsonl.gz

These runs are simulated fresh each time the site is deployed, so they show what the current code produces — not a recording.

Run it yourself

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

What it is good for, and what it is not

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.

How far to trust it

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.