{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "7ff1573c",
   "metadata": {},
   "source": [
    "# The Frequency–Current (F–I) Curve\n",
    "\n",
    "A neuron's **F–I curve** relates the amplitude of a sustained input current to its steady-state firing rate. It is one of the most basic characterizations of a neuron's excitability. Here we drive a population of identical HH neurons, each with a different constant current, and measure the firing rate of each."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e3aa055f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-05-25T10:05:03.885496Z",
     "iopub.status.busy": "2026-05-25T10:05:03.885279Z",
     "iopub.status.idle": "2026-05-25T10:05:07.414095Z",
     "shell.execute_reply": "2026-05-25T10:05:07.413457Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "An NVIDIA GPU may be present on this machine, but a CUDA-enabled jaxlib is not installed. Falling back to cpu.\n"
     ]
    }
   ],
   "source": [
    "import brainstate\n",
    "import brainunit as u\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import braincell"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7592729e",
   "metadata": {},
   "source": [
    "## A population of HH neurons\n",
    "\n",
    "`braincell` cells are vectorized: building `HH(N)` creates `N` independent neurons that we can drive with an `N`-vector of currents in a single pass."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "480b5f64",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-05-25T10:05:07.417990Z",
     "iopub.status.busy": "2026-05-25T10:05:07.417625Z",
     "iopub.status.idle": "2026-05-25T10:05:07.421919Z",
     "shell.execute_reply": "2026-05-25T10:05:07.421111Z"
    }
   },
   "outputs": [],
   "source": [
    "class HH(braincell.SingleCompartment):\n",
    "    def __init__(self, size, solver='exp_euler'):\n",
    "        super().__init__(size, V_th=20. * u.mV, solver=solver)\n",
    "        self.na = braincell.ion.SodiumFixed(size, E=50. * u.mV)\n",
    "        self.na.add(INa=braincell.channel.Na_HH1952(size))\n",
    "        self.k = braincell.ion.PotassiumFixed(size, E=-77. * u.mV)\n",
    "        self.k.add(IK=braincell.channel.K_HH1952(size))\n",
    "        self.IL = braincell.channel.IL(size, E=-54.387 * u.mV,\n",
    "                                       g_max=0.03 * (u.mS / u.cm ** 2))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7c0375ac",
   "metadata": {},
   "source": [
    "## Sweep the input current\n",
    "\n",
    "We sweep 11 current densities from 0 to 20 uA/cm^2. We simulate 600 ms and **discard the first 100 ms** as a warm-up so onset transients do not inflate the rate, then count spikes over the remaining 500 ms."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "4449c891",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-05-25T10:05:07.423645Z",
     "iopub.status.busy": "2026-05-25T10:05:07.423474Z",
     "iopub.status.idle": "2026-05-25T10:05:18.694708Z",
     "shell.execute_reply": "2026-05-25T10:05:18.693827Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "spike counts: [15, 28, 35, 39, 42, 45, 48, 50, 53, 55, 56]\n"
     ]
    }
   ],
   "source": [
    "n_levels = 11\n",
    "amplitudes = np.linspace(0., 20., n_levels)        # uA/cm^2\n",
    "I = amplitudes * (u.uA / u.cm ** 2)\n",
    "\n",
    "net = HH(n_levels)\n",
    "net.init_state()\n",
    "\n",
    "warmup = 100. * u.ms\n",
    "total = 600. * u.ms\n",
    "\n",
    "def step(t):\n",
    "    with brainstate.environ.context(t=t):\n",
    "        net.update(I)\n",
    "    return t, net.spike.value\n",
    "\n",
    "with brainstate.environ.context(dt=0.01 * u.ms):\n",
    "    times = u.math.arange(0. * u.ms, total, brainstate.environ.get_dt())\n",
    "    ts, spikes = brainstate.transform.for_loop(step, times)\n",
    "\n",
    "mask = (ts >= warmup)\n",
    "counts = np.asarray(u.math.sum(spikes[mask], axis=0))\n",
    "rate = counts / float((total - warmup) / u.second)   # Hz\n",
    "print('spike counts:', counts.astype(int).tolist())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d76f7018",
   "metadata": {},
   "source": [
    "## Plot the F–I curve\n",
    "\n",
    "Firing rate rises monotonically with input current — the signature of a Type-I/Type-II excitable membrane."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "d1edfdb2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-05-25T10:05:18.696707Z",
     "iopub.status.busy": "2026-05-25T10:05:18.696411Z",
     "iopub.status.idle": "2026-05-25T10:05:18.822958Z",
     "shell.execute_reply": "2026-05-25T10:05:18.821877Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(5, 4))\n",
    "plt.plot(amplitudes, rate, 'o-')\n",
    "plt.xlabel('Input current density (uA/cm$^2$)')\n",
    "plt.ylabel('Firing rate (Hz)')\n",
    "plt.title('F\\u2013I curve of an HH neuron')\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "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.13.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
