{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Example: Degradable buffer"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Calcium is heavily buffered in cells, as it is a major second messenger molecule. \n",
"\n",
"## Calbindin D28K dynamics\n",
"\n",
"The calcium buffering protein Calbindin D28K has 6 EF-hands, four of which are active calcium ion binding sites. These sites are not equally active. A calcium ion is not free to bind to any of the sites equally. Instead, calcium ions are bound in sequence: 1, 4, 5, 3 with the last binding having the lowest affinity.\n",
"(Venters et al., 2003.)\n",
"\n",
"(To be clear, these dynamics are not representative of all calcium buffers; Parvalbumin and Calbindin D9K show little conformational change when carrying calcium.)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\\mathrm{Ca} + \\mathrm{Calbindin_0} \\rightleftharpoons \\mathrm{Calbindin_1}$$\n",
"$$\\mathrm{Ca} + \\mathrm{Calbindin_1} \\rightleftharpoons \\mathrm{Calbindin_{14}}$$\n",
"$$\\mathrm{Ca} + \\mathrm{Calbindin_{14}} \\rightleftharpoons \\mathrm{Calbindin_{145}}$$\n",
"$$\\mathrm{Ca} + \\mathrm{Calbindin_{145}} \\rightleftharpoons \\mathrm{Calbindin_{1453}}$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## A model\n",
"\n",
"For our model, let us suppose that instead of calbindin D28K specifically, which has its own very specific binding affinities, we have some arbitrary buffer buf that also has 4 binding sites that load sequentially."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"execution": {
"iopub.execute_input": "2025-08-18T03:36:37.553468Z",
"iopub.status.busy": "2025-08-18T03:36:37.553294Z",
"iopub.status.idle": "2025-08-18T03:36:37.951648Z",
"shell.execute_reply": "2025-08-18T03:36:37.951235Z"
}
},
"outputs": [],
"source": [
"from neuron import n, rxd"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"execution": {
"iopub.execute_input": "2025-08-18T03:36:37.953965Z",
"iopub.status.busy": "2025-08-18T03:36:37.953777Z",
"iopub.status.idle": "2025-08-18T03:36:37.961312Z",
"shell.execute_reply": "2025-08-18T03:36:37.960979Z"
}
},
"outputs": [],
"source": [
"# where\n",
"soma = n.Section(name=\"soma\")\n",
"cyt = rxd.Region([soma], nrn_region=\"i\")\n",
"# who\n",
"ca = rxd.Species(cyt, name=\"ca\", charge=2, initial=1e-4)\n",
"buf = rxd.Species(cyt, name=\"buf\", initial=1e-4)\n",
"cabuf = rxd.Species(cyt, name=\"cab2uf\", initial=0)\n",
"# what\n",
"buffering = rxd.Reaction(2 * ca + buf, cabuf, 1e6, 1e-2)\n",
"degradation = rxd.Rate(buf, -1e-3 * buf)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For versions of NEURON before 7.7, we need to initialize the simulation here to enable using pointers for\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's set up some recording:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"execution": {
"iopub.execute_input": "2025-08-18T03:36:37.965495Z",
"iopub.status.busy": "2025-08-18T03:36:37.962945Z",
"iopub.status.idle": "2025-08-18T03:36:37.973631Z",
"shell.execute_reply": "2025-08-18T03:36:37.973291Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"Vector[2]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"t = n.Vector()\n",
"ca_vec = n.Vector()\n",
"buf_vec = n.Vector()\n",
"t.record(n._ref_t)\n",
"ca_vec.record(soma(0.5)._ref_cai)\n",
"buf_vec.record(soma(0.5)._ref_bufi)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A more realistic model would include "
]
}
],
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.10"
}
},
"nbformat": 4,
"nbformat_minor": 2
}