{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c5d5d78f",
   "metadata": {},
   "source": [
    "# Populations and devices\n",
    "\n",
    "**What you'll learn / who it's for (simulation).** Scale from one neuron to *populations*: create groups of NEST-compatible neurons, combine and slice them with `NodeView` algebra, attach stimulation and recording devices, and read population spikes back as a raster and a firing rate.\n",
    "\n",
    "Mirrors PyNEST Part 2 in the `brainpy.state` idiom."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "ef06565c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-06-17T09:12:40.041201Z",
     "iopub.status.busy": "2026-06-17T09:12:40.041058Z",
     "iopub.status.idle": "2026-06-17T09:12:43.944511Z",
     "shell.execute_reply": "2026-06-17T09:12:43.943734Z"
    }
   },
   "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 jax\n",
    "jax.config.update('jax_enable_x64', True)\n",
    "import brainstate\n",
    "brainstate.environ.set(precision=64)\n",
    "\n",
    "import numpy as np\n",
    "import brainunit as u\n",
    "import braintools\n",
    "import matplotlib.pyplot as plt\n",
    "from brainpy import state as bp"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a06cd749",
   "metadata": {},
   "source": [
    "## Creating a population\n",
    "\n",
    "`sim.create(model, N, ...)` makes a population of `N` neurons and returns a `NodeView`. Parameters use NEST's names and units; for a large set, pass a `params=dict(...)` mapping. Here we build an excitatory and an inhibitory population of current-based IAF neurons."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "321d2654",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-06-17T09:12:43.946614Z",
     "iopub.status.busy": "2026-06-17T09:12:43.946227Z",
     "iopub.status.idle": "2026-06-17T09:12:46.655789Z",
     "shell.execute_reply": "2026-06-17T09:12:46.655001Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ne: <brainpy.state.NodeView object at 0x7f57b582fe00> \n",
      "ni: <brainpy.state.NodeView object at 0x7f57b59cf750>\n"
     ]
    }
   ],
   "source": [
    "npar = dict(C_m=250. * u.pF, tau_m=20. * u.ms, t_ref=2. * u.ms,\n",
    "            E_L=0. * u.mV, V_reset=0. * u.mV, V_th=20. * u.mV,\n",
    "            V_initializer=braintools.init.Constant(0. * u.mV))\n",
    "\n",
    "sim = bp.Simulator(dt=0.1 * u.ms)\n",
    "ne = sim.create(bp.iaf_psc_alpha, 80, params=npar)    # excitatory\n",
    "ni = sim.create(bp.iaf_psc_alpha, 20, params=npar)    # inhibitory\n",
    "print('ne:', ne, '\\nni:', ni)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2a75c83e",
   "metadata": {},
   "source": [
    "## `NodeView` algebra: combine and slice\n",
    "\n",
    "Two operators let a single `connect` target a combined or partial population:\n",
    "\n",
    "- **concatenate** — `ne + ni` is the whole network (E then I),\n",
    "- **slice** — `ne[:10]` is the first 10 excitatory neurons.\n",
    "\n",
    "We drive both populations with a shared Poisson background (`all_to_all`) and record a sub-sample of each."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "0d66026d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-06-17T09:12:46.657482Z",
     "iopub.status.busy": "2026-06-17T09:12:46.657155Z",
     "iopub.status.idle": "2026-06-17T09:12:48.781981Z",
     "shell.execute_reply": "2026-06-17T09:12:48.781035Z"
    }
   },
   "outputs": [],
   "source": [
    "noise = sim.create(bp.poisson_generator, rate=8000. * u.Hz, rng_seed=0)\n",
    "esr = sim.create(bp.spike_recorder)\n",
    "isr = sim.create(bp.spike_recorder)\n",
    "\n",
    "sim.connect(noise, ne + ni, weight=10. * u.pA, delay=1.5 * u.ms, rule=bp.all_to_all)\n",
    "sim.connect(ne[:10], esr)            # record the first 10 excitatory\n",
    "sim.connect(ni[:10], isr)            # record the first 10 inhibitory\n",
    "\n",
    "res = sim.simulate(500. * u.ms)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0da3a169",
   "metadata": {},
   "source": [
    "## Reading population output: rate and raster\n",
    "\n",
    "`res.rate(view)` gives the mean firing rate (Hz) and `res.spikes(view)` gives the per-step spike matrix `(T, N)` we can scatter into a raster."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "5bd0ea0d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-06-17T09:12:48.785155Z",
     "iopub.status.busy": "2026-06-17T09:12:48.784887Z",
     "iopub.status.idle": "2026-06-17T09:12:49.003367Z",
     "shell.execute_reply": "2026-06-17T09:12:49.002673Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "exc rate: 51.20 spks/s\n",
      "inh rate: 50.20 spks/s\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAEiCAYAAABkykQ1AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQvlJREFUeJzt3Xl8TPf+P/DXZGSVZBKVRUgk3JYmsS+hWpJKpa0rFKVoa6m0JYq0XLS3lqvW3ra0Wtu9wrcUxU1nKFo0E1SLCrW0Te1SStqSSezMfH5/eGR+RhYZk7PM8Xo+HvN4cObM5/X5fM5nxnmbOTM6IYQAERERERGRCzyU7gAREREREbk/FhZEREREROQyFhZEREREROQyFhZEREREROQyFhZEREREROQyFhZEREREROQyFhZEREREROQyFhZEREREROQyFhZEREREROQyFhZE5DYGDBiA6OhopbtBVWTXrl3w8vLCyZMnHba/++67qFevHvR6PZo2bQoAiI6OxoABA+TvJClm3rx5iIqKwrVr15TuChFVEgsLInJbly9fxsSJE2E2m++5jR07dmDixIkoLCyssn65k6qYw3v11ltvoU+fPqhbt65929dff41//OMfaNeuHTIzMzF16lRJsj/77DPMmjWr0vt//fXXeOmllxAfHw+9Xl9hgWuz2TBz5kzExMTAx8cHjRs3xvLly13v9H1mwIABuH79OubPn690V4iokqop3QEiospauHAhbDab/e+XL1/GpEmTAACJiYn31OaOHTswadIkDBgwAEFBQVXQS/dSFXN4L/bt24fNmzdjx44dDtu/+eYbeHh44L///S+8vLzs2/Py8uDhUXX/F/bZZ5/h4MGDGDlyZKX3X7lyJZo3b46IiIgK933rrbcwffp0pKWloVWrVjAajejbty90Oh2ee+65Kuj9/cHHxwf9+/fH+++/j9deew06nU7pLhHRXfAdCyJyG56envD29la6G3clhMCVK1fcpl0pXLp0qcL7MzMzERUVhTZt2jhsLygogK+vr0NRAQDe3t7w9PR0KdMVU6dORVFREb799ls0adKk3P1Onz6N9957D+np6ViwYAHS0tKwdu1aPPbYYxg9ejSsVqtkfZSClHNaGb169cLJkyeRnZ2taD+IqHJYWBDRPTt9+jQGDRqEsLAweHt7Iy4uDosWLbLff+XKFTRs2BANGzZ0OCE+f/48atWqhUceecThRGvDhg3o0KEDAgICEBgYiFatWuGzzz6z33/7NRYnTpxASEgIAGDSpEnQ6XTQ6XSYOHEiAGD//v0YMGAA6tWrBx8fH4SHh2PQoEH466+/7O1NnDgRo0ePBgDExMTY2zhx4gQA4ObNm5g8eTLq168Pb29vREdH48033yz1me/o6Gj8/e9/x1dffYWWLVvC19cX8+fPR4cOHco9CW3QoAFSUlIqnN/y2gVunZg//vjjCA0Nhbe3N2JjYzF37txSbfzwww9ISUlBzZo14evri5iYGAwaNKhScwgAv/zyC3r27IkaNWrAx8cHLVu2hMlkcshYvHgxdDodcnJyMHToUISGhqJOnToVju2LL77A448/7vC/0DqdDpmZmbh06ZK9L4sXL7bPxe3XWFSUWVxcjJEjRyI6Ohre3t4IDQ3FE088gdzcXAC33pn58ssvcfLkSXvO3a7diYiIuGthAwBGoxE3btzA0KFDHcY1ZMgQ/Pbbb/juu+8qfPyAAQPg7++P06dPo1u3bvD390dISAhGjRpVqiix2WyYNWsW4uLi4OPjg7CwMLzyyiu4cOGCw353HtMSzswpAHzyySeIi4uDt7c3IiIikJ6eXuojhImJiYiPj8dPP/2EpKQk+Pn5oXbt2pg5c2ap/I8++ghxcXHw8/NDcHAwWrZs6fB8B4AWLVqgRo0aMBqNFc4bEakDPwpFRPfk3LlzaNOmDXQ6HYYNG4aQkBBs2LABL730EoqKijBy5Ej4+vpiyZIlaNeuHd566y28//77AID09HRYLBYsXrwYer0ewK2TmkGDBiEuLg7jxo1DUFAQ9u7di40bN6Jv376l8kNCQjB37lwMGTIEzzzzDLp37w4AaNy4MQBg06ZNOHbsGAYOHIjw8HAcOnQICxYswKFDh/D9999Dp9Ohe/fu+PXXX7F8+XJ88MEHqFmzpr1tABg8eDCWLFmCnj174o033sDOnTsxbdo0/Pzzz8jKynLoT15eHvr06YNXXnkFaWlpaNCgAfz9/ZGWloaDBw8iPj7evu/u3bvx66+/4p///Odd57msdgFg7ty5iIuLQ2pqKqpVq4a1a9di6NChsNlsSE9PB3Drf/87deqEkJAQjB07FkFBQThx4gT+97//VWoODx06hHbt2qF27doYO3Ysqlevjs8//xzdunXDmjVr8Mwzzzj0dejQoQgJCcH48eMr/J/u06dP49SpU2jevLnD9k8//RQLFizArl278J///AcA8Mgjj1Q4P2Vlvvrqq1i9ejWGDRuG2NhY/PXXX9i+fTt+/vlnNG/eHG+99RYsFgt+++03fPDBBwAAf3//ux6Lyti7dy+qV6+Ohx9+2GF769at7fc/+uijFbZhtVqRkpKChIQE/Pvf/8bmzZvx3nvvoX79+hgyZIh9v1deeQWLFy/GwIEDMXz4cBw/fhxz5szB3r178e2331aqECpLWXM6ceJETJo0CcnJyRgyZAjy8vIwd+5c7N69u1TWhQsX8OSTT6J79+7o1asXVq9ejTFjxqBRo0Z46qmnANz6WOPw4cPRs2dPjBgxAlevXsX+/fuxc+fOUs/35s2b49tvv72nsRCRzAQR0T146aWXRK1atcSff/7psP25554TBoNBXL582b5t3LhxwsPDQ2zdulWsWrVKABCzZs2y319YWCgCAgJEQkKCuHLlikN7NpvN/uf+/fuLunXr2v/+xx9/CABiwoQJpfp3e36J5cuXCwBi69at9m3vvvuuACCOHz/usO++ffsEADF48GCH7aNGjRIAxDfffGPfVrduXQFAbNy40WHfwsJC4ePjI8aMGeOwffjw4aJ69eri4sWLpfp4u/LaLW98KSkpol69eva/Z2VlCQBi9+7d5WZUNIcdO3YUjRo1ElevXrVvs9ls4pFHHhEPPvigfVtmZqYAIB599FFx8+bNCsckhBCbN28WAMTatWtL3de/f39RvXr1Utvr1q0r+vfvX6lMg8Eg0tPTK+xD586dHdaSMyp6bOfOnR2OQYlLly4JAGLs2LEVtt2/f38BQPzrX/9y2N6sWTPRokUL+9+3bdsmAIhly5Y57Ldx48ZS28s7vpWd04KCAuHl5SU6deokrFarffucOXMEALFo0SL7tg4dOggA4v/+7//s265duybCw8NFjx497Nu6du0q4uLiKpyLEi+//LLw9fWt1L5EpCx+FIqInCaEwJo1a9ClSxcIIfDnn3/abykpKbBYLPaPnQC3/rczLi4O/fv3x9ChQ9GhQwcMHz7cfv+mTZtQXFyMsWPHwsfHxyHrXi/Y9PX1tf/56tWr+PPPP+2f57+9b+VZv349AOD111932P7GG28AAL788kuH7TExMaU+2mQwGNC1a1csX74cQggAt/43euXKlejWrRuqV69+136U1S7gOD6LxYI///wTHTp0wLFjx2CxWADAfjH6unXrcOPGjbtm3e78+fP45ptv0KtXLxQXF9uP719//YWUlBQcPnwYp0+fdnhMWlqa/R2oipR8HC04ONipPpWlrMygoCDs3LkTZ86ccbl9Z125cqXM64BK1nVlr5F59dVXHf7+2GOP4dixY/a/r1q1CgaDAU888YTD869Fixbw9/d36ZqEO+d08+bNuH79OkaOHOlwAX1aWhoCAwNLPRf8/f3x/PPP2//u5eWF1q1bO/Q/KCgIv/32G3bv3n3X/gQHB+PKlSu4fPnyPY+JiOTBwoKInPbHH3+gsLAQCxYsQEhIiMNt4MCBAG59DKeEl5cXFi1ahOPHj6O4uBiZmZkOBcPRo0cBwOHjQq46f/48RowYgbCwMPj6+iIkJAQxMTEAYD/xrsjJkyfh4eGBv/3tbw7bw8PDERQUVOq3F0ravtOLL76IU6dOYdu2bQBunaSdO3cOL7zwQqXGUV673377LZKTk1G9enUEBQUhJCQEb775JoD/P74OHTqgR48emDRpEmrWrImuXbsiMzOzUr8LcOTIEQgh8Pbbb5c6xhMmTADgeIwr6mt5SootV5SVOXPmTBw8eBCRkZFo3bo1Jk6c6HBSKyVfX98y5/fq1av2++/Gx8fH/nG8EsHBwQ7XThw+fBgWiwWhoaGljs/FixdLHRtn3DmnJWu95GN4Jby8vFCvXr1Sz4U6deqU+g+BO/s/ZswY+Pv7o3Xr1njwwQeRnp5e7sedStYJvxWKSP14jQUROa3kK1+ff/559O/fv8x9Sj6nX+Krr74CcOsE6/Dhw06fhDqrV69e2LFjB0aPHo2mTZvC398fNpsNTz75pMNX1t5NZU9myjthTElJQVhYGJYuXYr27dtj6dKlCA8PR3Jy8j23e/ToUXTs2BENGzbE+++/j8jISHh5eWH9+vX44IMP7OPT6XRYvXo1vv/+e6xduxZfffUVBg0ahPfeew/ff/99hdcVlLQxatSoci8yv7PoqsxJMwA88MADAFDqIuN7UVZmr1698NhjjyErKwtff/013n33XcyYMQP/+9//7J/xl0qtWrWQnZ0NIYTD2vn9998B4K5fVQugUu/62Gw2hIaGYtmyZWXef2dhUpbyvqGqssexPOX1//ZC8uGHH0ZeXh7WrVuHjRs3Ys2aNfjkk08wfvx4+9cfl7hw4QL8/Pxc7hcRSY+FBRE5LSQkBAEBAbBarZU6Qd6/fz/+9a9/YeDAgdi3bx8GDx6MAwcOwGAwAADq168PADh48GCpk9WKlHfSf+HCBWzZsgWTJk3C+PHj7dsPHz5c6Tbq1q0Lm82Gw4cPO1yIe+7cORQWFjr8qFtF9Ho9+vbti8WLF2PGjBn44osvKv2RofKsXbsW165dg8lkQlRUlH17eR9/adOmDdq0aYMpU6bgs88+Q79+/bBixQoMHjy43PHXq1cPwK2v+K1sEVRZDRs2BAAcP368Stu9Xa1atTB06FAMHToUBQUFaN68OaZMmWIvLKT63++mTZviP//5D37++WfExsbat+/cudN+f1WoX78+Nm/ejHbt2t31hDs4OLjUtzddv37dXuzcTclaz8vLs6+LkjaOHz9+z+ujevXq6N27N3r37o3r16+je/fumDJlCsaNG+fwkcjjx4+XuhieiNSJH4UiIqfp9Xr06NEDa9aswcGDB0vd/8cff9j/fOPGDQwYMAARERGYPXs2Fi9ejHPnziEjI8O+T6dOnRAQEIBp06bZPzJSoqKPy/j5+QFAqZOmkpP2Ox9b1i8tl1zncGcbTz/9dJmPKflmq86dO5fbrzu98MILuHDhAl555RVcvHjR4fPn96Ks8VksFmRmZjrsd+HChVJzUHJiW/JxnfLmMDQ0FImJiZg/f36ZJ6C3H2Nn1a5dG5GRkfjhhx/uuY3yWK3WUh91Cw0NRUREhMNHlKpXr16pj8Q5q2vXrvD09MQnn3xi3yaEwLx581C7du27fstVZfXq1QtWqxWTJ08udd/Nmzcdjmf9+vWxdetWh30WLFhQ6d/USE5OhpeXFz788EOH9fTf//4XFovFqedCidu/9hm49bGq2NhYCCFKXQ+Um5tbZfNGRNLiOxZEdE+mT5+O7OxsJCQkIC0tDbGxsTh//jxyc3OxefNmnD9/HgDwzjvvYN++fdiyZQsCAgLQuHFjjB8/Hv/85z/Rs2dPPP300wgMDMQHH3yAwYMHo1WrVujbty+Cg4Px448/4vLly1iyZEmZffD19UVsbCxWrlyJhx56CDVq1EB8fDzi4+PRvn17zJw5Ezdu3EDt2rXx9ddfl/k/5C1atABw69eSn3vuOXh6eqJLly5o0qQJ+vfvjwULFqCwsBAdOnTArl27sGTJEnTr1g1JSUmVnqtmzZohPj4eq1atwsMPP1zqa1ad1alTJ3h5eaFLly72YmXhwoUIDQ11KAKWLFmCTz75BM888wzq16+P4uJiLFy4EIGBgfbCqaI5/Pjjj/Hoo4+iUaNGSEtLQ7169XDu3Dl89913+O233/Djjz/e8xi6du2KrKysUh8ZclVxcTHq1KmDnj17okmTJvD398fmzZuxe/duvPfee/b9WrRogZUrV+L1119Hq1at4O/vjy5dupTb7v79++2/33HkyBFYLBa88847AIAmTZrYH1unTh2MHDkS7777Lm7cuIFWrVrhiy++wLZt27Bs2TKX3qm6XYcOHfDKK69g2rRp2LdvHzp16gRPT08cPnwYq1atwuzZs9GzZ08At742+dVXX0WPHj3wxBNP4Mcff8RXX31l/3rluwkJCcG4ceMwadIkPPnkk0hNTUVeXh4++eQTtGrV6p4K5U6dOiE8PBzt2rVDWFgYfv75Z8yZMwedO3dGQECAfb89e/bg/Pnz6Nq1q9MZRKQA+b+Iioi04ty5cyI9PV1ERkYKT09PER4eLjp27CgWLFgghBBiz549olq1auK1115zeNzNmzdFq1atREREhLhw4YJ9u8lkEo888ojw9fUVgYGBonXr1mL58uX2++/8ulkhhNixY4do0aKF8PLycvhazd9++00888wzIigoSBgMBvHss8+KM2fOlPnVm5MnTxa1a9cWHh4eDl89e+PGDTFp0iQRExMjPD09RWRkpBg3bpzD168KcetrOzt37lzhXM2cOVMAEFOnTr3LrFauXZPJJBo3bix8fHxEdHS0mDFjhli0aJFD/3Nzc0WfPn1EVFSU8Pb2FqGhoeLvf/+7+OGHHxzaKm8OhRDi6NGj4sUXXxTh4eHC09NT1K5dW/z9738Xq1evtu9T8jWlFX2t7Z1yc3MFALFt2zaH7c5+3eydmdeuXROjR48WTZo0EQEBAaJ69eqiSZMm4pNPPnHY7+LFi6Jv374iKChIALjrV8+W5JV1u71fQghhtVrF1KlTRd26dYWXl5eIi4sTS5cuvfukVDD+CRMmiLL+yV6wYIFo0aKF8PX1FQEBAaJRo0biH//4hzhz5oxDf8aMGSNq1qwp/Pz8REpKijhy5Eil57TEnDlzRMOGDYWnp6cICwsTQ4YMcXj+CnHr62bL+hrZO5+78+fPF+3btxcPPPCA8Pb2FvXr1xejR48WFovF4XFjxowRUVFRDl87TUTqpROiCr6Wg4iIKjR79mxkZGTgxIkTDtdF3M86duyIiIgIfPrpp0p3hVTo2rVriI6OxtixYzFixAilu0NElcDCgohIYkIINGnSBA888IBLvy+gNTt37sRjjz2Gw4cPV/pieLp/zJs3D1OnTsXhw4fL/G0QIlIfFhZERBK5dOkSTCYTsrOzsXDhQhiNRqSmpirdLSIiIkmwsCAiksiJEycQExODoKAgDB06FFOmTFG6S0RERJJhYUFERERERC7j71gQEREREZHLWFgQEREREZHL3PoH8mw2G86cOYOAgIAq/YElIiIiIiK69c2GxcXFiIiIgIdHxe9JuHVhcebMGURGRirdDSIiIiIiTcvPz0edOnUq3MetC4uAgAAAtwYaGBiocG+IiIiIiLSlqKgIkZGR9vPuirh1YVHy8afAwEAWFkREREREEqnMZQe8eJuIiIiIiFzGwoKIiIiIiFzGwoKIiIiIiFzGwoKIiIiIiFzGwoKIiIiIiFzGwqKKmUwmZGRkwGQyuVXbbF99OXLmamXutHhslMiWYzxaXQtK9UOL86mGY6jFccs9Jnd+DmjtWMhCuDGLxSIACIvFonRXhBBCGI1GAUDo9XoBQBiNRrdom+2rL0fOXK3MnRaPjRLZcoxHq2tBqX5ocT7VcAy1OG65x+TOzwGtHQtXOHO+zXcsqlB2djb0ej2sViv0ej3MZrNbtM321ZcjZ65W5k6Lx0aJbDnGo9W1oFQ/tDifajiGWhy33GNy5+eA1o6FXFhYVKGkpCT7ArFarUhMTHSLttm++nLkzNXK3Gnx2CiRLcd4tLoWlOqHFudTDcdQi+OWe0zu/BzQ2rGQi04IIZTuxL0qKiqCwWCAxWJRzS9vm0wmmM1mJCYmIjU11W3aZvvqy5EzVytzp8Vjo0S2HOPR6lpQqh9anE81HEMtjlvuMbnzc0Brx+JeOXO+zcKCiIiIiIjK5Mz5Nj8KRURERERELmNhQURERERELmNhQURERERELmNhQURERERELmNhQURERERELmNhQURERERELmNhQURERERELmNhQURERERELmNhQURERERELmNhQURERERELmNhQURERERELmNhQURERERELlO0sLBarXj77bcRExMDX19f1K9fH5MnT4YQQsluERER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H2H27Nno06cP6tWrh+HDh+PHH3+s6r4REREREZGbcLqwePLJJzFp0iQsWbIEy5Ytw969e9G+fXu0adMGM2fOlKKPbstkMiEjIwMmk0kTWXKOR+o8ucaihRytrWM15CoxTo7R/fK0/Nxzt9csd+uvmvK1+lqgxXmrEsJJycnJ4vTp06W2r1u3ToSHhzvbnEssFosAICwWi6y5lWE0GgUAodfrBQBhNBrdOkvO8UidJ9dYtJCjtXWshlwlxskxul+elp977vaa5W79VVO+Vl8LtDhvFXHmfNvpdyw2bdqEiIiIUts7d+6MAwcOONucZmVnZ0Ov18NqtUKv18NsNrt1lpzjkTpPrrFoIUdr61gNuUqMk2N0vzwtP/fc7TXL3fqrpnytvhZocd6qyj1dY7Ft2zY8//zzaNu2LU6fPg0A+PTTT/HLL79UaefcWVJSkn1BWK1WJCYmunWWnOOROk+usWghR2vrWA25SoyTY3S/PC0/99ztNcvd+qumfK2+Fmhx3qqK07+8vWbNGrzwwgvo168fPv30U/z000+oV68e5syZg/Xr12P9+vVS9bUUtf/ytslkgtlsRmJiIlJTU90+S87xSJ0n11i0kKO1dayGXCXGyTG6X56Wn3vu9prlbv1VU75WXwu0OG/lceZ82+nColmzZsjIyMCLL76IgIAA/Pjjj6hXrx727t2Lp556CmfPnnWp885Qe2FBREREROTOnDnfdvqjUHl5eWjfvn2p7QaDAYWFhc42R0REREREGuB0YREeHo4jR46U2r59+3bUq1evSjpFRERERETuxenCIi0tDSNGjMDOnTuh0+lw5swZLFu2DKNGjcKQIUOk6CMREREREalcNWcfMHbsWNhsNnTs2BGXL19G+/bt4e3tjVGjRuG1116Too9ERERERKRyTl+8XeL69es4cuQILl68iNjYWPj7+1d13+6KF28TEREREUnHmfNtp9+xKOHl5YXY2Nh7fTgREREREWnIPf1AHhERERER0e1YWBARERERkctYWBARERERkctYWBARERERkctYWBARERERkctYWBARERERkctYWBARERERkcsULSymTZuGVq1aISAgAKGhoejWrRvy8vKU7BIREREREd0DRQuLnJwcpKen4/vvv8emTZtw48YNdOrUCZcuXVKyW0RERERE5CRFC4uNGzdiwIABiIuLQ5MmTbB48WKcOnUKe/bsUbJbLjOZTMjIyIDJZHLbHC2MQQ25WsuRM08rGVLnaGEMSuRIleXu/VcyS6l/D+TI1+LzR4lcHiM3IFTk8OHDAoA4cOBAmfdfvXpVWCwW+y0/P18AEBaLReaels9oNAoAQq/XCwDCaDS6XY4WxqCGXK3lyJmnlQypc7QwBiVypMpy9/4rmaXUvwdy5Gvx+aNELo+RciwWS6XPt1Vz8bbNZsPIkSPRrl07xMfHl7nPtGnTYDAY7LfIyEiZe3l32dnZ0Ov1sFqt0Ov1MJvNbpejhTGoIVdrOXLmaSVD6hwtjEGJHKmy3L3/SmYp9e+BHPlafP4okctj5B5UU1ikp6fj4MGDWLFiRbn7jBs3DhaLxX7Lz8+XsYeVk5SUZF8wVqsViYmJbpejhTGoIVdrOXLmaSVD6hwtjEGJHKmy3L3/SmYp9e+BHPlafP4okctj5B50QgihdCeGDRsGo9GIrVu3IiYmptKPKyoqgsFggMViQWBgoIQ9dI7JZILZbEZiYiJSU1PdMkcLY1BDrtZy5MzTSobUOVoYgxI5UmW5e/+VzFLq3wM58rX4/FEil8dIGc6cbytaWAgh8NprryErKwtmsxkPPvigU49Xa2FBRERERKQFzpxvV5OpT2VKT0/HZ599BqPRiICAAJw9exYAYDAY4Ovrq2TXiIiIiIjICYq+Y6HT6crcnpmZiQEDBtz18XzHgoiIiIhIOm7zjoUKLu8gIiIiIqIqoJpvhSIiIiIiIvfFwoKIiIiIiFzGwoKIiIiIiFzGwoKIiIiIiFzGwoKIiIiIiFzGwoKIiIiIiFzGwoKIiIiIiFzGwoKIiIiIiFzGwoKIiIiIiFzGwoKIiIiIiFzGwoKIiIiIiFzGwoKIiIiIiFzGwqIKmUwmZGRkwGQyuXWGFnPU0Aet5cidp4a1cjul+qPlXCkzpGhbDWuSx0VdOXJlavF1QM4xafXfSVUQbsxisQgAwmKxKN0VYTQaBQCh1+sFAGE0Gt0yQ4s5auiD1nLkzlPDWlFDf7ScK2WGFG2rYU3yuKgrR65MLb4OyDkmrf47KSVnzrf5jkUVyc7Ohl6vh9VqhV6vh9lsdssMLeaooQ9ay5E7Tw1rRQ390XKulBlStK2GNcnjoq4cuTK1+Dog55i0+u+kWrCwqCJJSUn2RWO1WpGYmOiWGVrMUUMftJYjd54a1ooa+qPlXCkzpGhbDWuSx0VdOXJlavF1QM4xafXfSbXQCSGE0p24V0VFRTAYDLBYLAgMDFS6OzCZTDCbzUhMTERqaqrbZmgxRw190FqO3HlqWCtq6I+Wc6XMkKJtNaxJHhd15ciVqcXXATnHpNV/J6XizPk2CwsiIiIiIiqTM+fb/CgUERERERG5jIUFERERERG5jIUFERERERG5jIUFERERERG5jIUFERERERG5jIUFERERERG5jIUFERERERG5jIUFERERERG5jIUFERERERG5jIUFERERERG5jIUFERERERG5jIUFERERERG5TBWFxccff4zo6Gj4+PggISEBu3btUrpLRERERETkBMULi5UrV+L111/HhAkTkJubiyZNmiAlJQUFBQVKd42IiIiIiCpJ8cLi/fffR1paGgYOHIjY2FjMmzcPfn5+WLRokdJdc5rJZEJGRgZMJpMmcpTI1FqO1JmcL/XnKDF3auiDu613uedIK+tOqfUtR66W51BLzyW5+yBV22qYtyohFHTt2jWh1+tFVlaWw/YXX3xRpKamltr/6tWrwmKx2G/5+fkCgLBYLDL1uHxGo1EAEHq9XgAQRqPRrXOUyNRajtSZnC/15ygxd2rog7utd7nnSCvrTqn1LUeuludQS88lufsgVdtqmLeKWCyWSp9vK/qOxZ9//gmr1YqwsDCH7WFhYTh79myp/adNmwaDwWC/RUZGytXVu8rOzoZer4fVaoVer4fZbHbrHCUytZYjdSbnS/05SsydGvrgbutd7jnSyrpTan3LkavlOdTSc0nuPkjVthrmraoo/lEoZ4wbNw4Wi8V+y8/PV7pLdklJSfYFYbVakZiY6NY5SmRqLUfqTM6X+nOUmDs19MHd1rvcc6SVdafU+pYjV8tzqKXnktx9kKptNcxbVdEJIYRS4devX4efnx9Wr16Nbt262bf3798fhYWFMBqNFT6+qKgIBoMBFosFgYGBEvf27kwmE8xmMxITE5Gamur2OUpkai1H6kzOl/pzlJg7NfTB3da73HOklXWn1PqWI1fLc6il55LcfZCqbTXMW3mcOd9WtLAAgISEBLRu3RofffQRAMBmsyEqKgrDhg3D2LFjK3ys2goLIiIiIiItceZ8u5pMfSrX66+/jv79+6Nly5Zo3bo1Zs2ahUuXLmHgwIFKd42IiIiIiCpJ8cKid+/e+OOPPzB+/HicPXsWTZs2xcaNG0td0E1EREREROql+EehXMGPQhERERERSceZ8223+lYoIiIiIiJSJxYWRERERETkMsWvsXBFyae4ioqKFO4JEREREZH2lJxnV+bqCbcuLIqLiwFAVb/ATURERESkNcXFxTAYDBXu49YXb9tsNpw5cwYBAQHQ6XQO9xUVFSEyMhL5+fm8sJvuiuuFnMH1QpXFtULO4HohZ8i1XoQQKC4uRkREBDw8Kr6Kwq3fsfDw8ECdOnUq3CcwMJBPTqo0rhdyBtcLVRbXCjmD64WcIcd6uds7FSV48TYREREREbmMhQUREREREblMs4WFt7c3JkyYAG9vb6W7Qm6A64WcwfVClcW1Qs7geiFnqHG9uPXF20REREREpA6afceCiIiIiIjkw8KCiIiIiIhcxsKCiIiIiIhcptnC4uOPP0Z0dDR8fHyQkJCAXbt2Kd0lktnWrVvRpUsXREREQKfT4YsvvnC4XwiB8ePHo1atWvD19UVycjIOHz7ssM/58+fRr18/BAYGIigoCC+99BIuXrwo4yhIDtOmTUOrVq0QEBCA0NBQdOvWDXl5eQ77XL16Fenp6XjggQfg7++PHj164Ny5cw77nDp1Cp07d4afnx9CQ0MxevRo3Lx5U86hkAzmzp2Lxo0b2787vm3bttiwYYP9fq4VKs/06dOh0+kwcuRI+zauF7rdxIkTodPpHG4NGza036/29aLJwmLlypV4/fXXMWHCBOTm5qJJkyZISUlBQUGB0l0jGV26dAlNmjTBxx9/XOb9M2fOxIcffoh58+Zh586dqF69OlJSUnD16lX7Pv369cOhQ4ewadMmrFu3Dlu3bsXLL78s1xBIJjk5OUhPT8f333+PTZs24caNG+jUqRMuXbpk3ycjIwNr167FqlWrkJOTgzNnzqB79+72+61WKzp37ozr169jx44dWLJkCRYvXozx48crMSSSUJ06dTB9+nTs2bMHP/zwAx5//HF07doVhw4dAsC1QmXbvXs35s+fj8aNGzts53qhO8XFxeH333+337Zv326/T/XrRWhQ69atRXp6uv3vVqtVREREiGnTpinYK1ISAJGVlWX/u81mE+Hh4eLdd9+1byssLBTe3t5i+fLlQgghfvrpJwFA7N69277Phg0bhE6nE6dPn5at7yS/goICAUDk5OQIIW6tDU9PT7Fq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",
      "text/plain": [
       "<Figure size 800x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(f'exc rate: {res.rate(esr):.2f} spks/s')\n",
    "print(f'inh rate: {res.rate(isr):.2f} spks/s')\n",
    "\n",
    "spk = np.asarray(res.spikes(esr))           # (T, 10)\n",
    "ts, ids = np.nonzero(spk > 0)\n",
    "t_ms = np.asarray(u.get_mantissa(res.times / u.ms))\n",
    "plt.figure(figsize=(8, 3))\n",
    "plt.scatter(t_ms[ts], ids, s=4, color='k')\n",
    "plt.xlabel('time (ms)'); plt.ylabel('exc neuron')\n",
    "plt.title('excitatory raster (first 10 neurons)')\n",
    "plt.tight_layout()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "103ecc43",
   "metadata": {},
   "source": [
    "## See also\n",
    "\n",
    "- [One neuron](01-one-neuron.ipynb) — the single-neuron starting point.\n",
    "- [Connect a network](03-connect-network.ipynb) — recurrent wiring rules.\n",
    "- [Connectivity](../connectivity.rst) — `NodeView` algebra and rules.\n",
    "- [Devices](../devices.rst) — the full device catalog."
   ]
  }
 ],
 "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
}
