Each receptor is modelled with simple occupancy theory. The orthosteric (agonist) site has affinity KA = 1; a competitive antagonist fights for the same site with affinity KB = 5, while a non-competitive antagonist binds a separate allosteric site (KB,nc = 5) that silences the receptor without blocking agonist binding:
Competitive:
EC50_app = K_A · (1 + [B]/K_B)
p_A = [A] / ([A] + EC50_app) → occupancy
Effect = E_max · p_A → parallel right-shift, same E_max
Non-competitive:
p_A = [A] / ([A] + K_A) → occupancy unaffected by [B]
p_block = [B] / ([B] + K_B,nc) → fraction silenced allosterically
Effect = E_max · p_A · (1 - p_block) → same EC50, lower E_max
- [A] slider — agonist concentration on a log scale (10⁻³ to 10² relative units).
- [B] slider — antagonist concentration, linear (0–20 units).
- Mode buttons — switch which mechanism [B] uses to fight the agonist.
- Each receptor carries a fixed random "identity" number; it is colored green/red/grey each frame by comparing that number against the current occupancy probabilities, so the population visibly redistributes as you move the sliders, exactly like a titration.
- The right-hand panel plots Effect vs log[A] at the current [B]; the dashed curve is the no-antagonist baseline, so you can see the shift (competitive) or the flattening (non-competitive) directly.
- Drag inside the receptor bed to pan it, scroll/pinch or use the zoom slider to zoom — the same map, just closer or further away.