{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "0b85a598",
   "metadata": {},
   "outputs": [],
   "source": [
    "from brian2 import *\n",
    "\n",
    "from adex_sine import *\n",
    "\n",
    "defaultclock.dt = 10 * us\n",
    "\n",
    "\n",
    "class Model:\n",
    "    # Model type flags\n",
    "    SINE = 0\n",
    "    EXP2SYN = 1\n",
    "\n",
    "    # Noise flags\n",
    "    HIGH = 0\n",
    "    LOW = 1\n",
    "    OFF = -1\n",
    "\n",
    "    # Noise parameters\n",
    "    EXCITATORY_NOISE_VARIANCE = {HIGH: 0.5 * nS, LOW: 0.25 * nS, OFF: 0 * nS}\n",
    "    INHIBITORY_NOISE_VARIANCE = {HIGH: 1.25 * nS, LOW: 0.625 * nS, OFF: 0 * nS}\n",
    "\n",
    "    # Noise mean conductance\n",
    "    EXCITATORY_CONDUCTANCE = 1 * nS\n",
    "    INHIBITORY_CONDUCTANCE = 4 * nS\n",
    "\n",
    "    DEFAULT_PARAMETERS = {\n",
    "        \"sigma_flux\" : 6.75*pA,     \n",
    "        \"c\": 85 * pF,\n",
    "        \"tau_w\": 18 * ms,\n",
    "        \"b\": 0.25 * nA,\n",
    "        \"a\": 1.3 * nS,\n",
    "        \"v_T\": -45 * mV,\n",
    "        \"v_thresh\": 0 * mV,\n",
    "        \"DeltaT\": 0.2 * mV,\n",
    "        # EQUILIBRIUM POTENTIAL\n",
    "        \"e_l\": -65 * mV,\n",
    "        \"e_ex\": 0 * mV,\n",
    "        \"e_in\": -70 * mV,\n",
    "        # CONDUCTANCES\n",
    "        \"g_l\": 3 * nS,\n",
    "        \"mu_ex\": 0 * nS,\n",
    "        \"mu_in\": 0 * nS,\n",
    "        # EXCITATORY NOISE\n",
    "        \"sigma_ex\": 0 * nS,\n",
    "        \"tau_noise_ex\": 3 * ms,\n",
    "        # INHIBITORY NOISE\n",
    "        \"sigma_in\": 0 * nS,\n",
    "        \"tau_noise_in\": 10 * ms,\n",
    "        # SINE INPUT\n",
    "        \"f\": 100 * Hz,\n",
    "        \"A\": 0 * pA,\n",
    "        \"i_injected\": 0 * pA,\n",
    "        \"v_reset\": -70 * mV,\n",
    "        # m current\n",
    "        \"g_adapt\": 10 * nS,\n",
    "        \"e_k\": -90*mV,\n",
    "        \"beta_z\": -35*mV,\n",
    "        \"gamma_z\": 4*mV,     #5\n",
    "        \"tau_z\": 100*ms,\n",
    "    }\n",
    "\n",
    "    def __init__(\n",
    "        self, n, *, stim=None, noise=None, resistance=None, additional_vars=()\n",
    "    ):\n",
    "        if resistance is None:\n",
    "            raise ValueError(\"Resistance must be specified\")\n",
    "\n",
    "        if noise is None:\n",
    "            raise ValueError(\"Noise must be specified\")\n",
    "\n",
    "        self.stim_type = stim\n",
    "        self._input_resistance = None\n",
    "        self._noise_level = None\n",
    "        self._duration = 0\n",
    "        self.recorded_vars = (\"v\",) + additional_vars\n",
    "\n",
    "        self.neurons = self.set_default(n_neuron=n)\n",
    "        self.set_resistance(resistance)\n",
    "        self.set_noise(noise)\n",
    "\n",
    "        self.spikes = None\n",
    "        self.spiker = None\n",
    "        self.synapses = None\n",
    "        self.inhib_synapses = None\n",
    "        self.smon = None\n",
    "        self.network = None\n",
    "        self.build_network()\n",
    "\n",
    "    def create_model(self):\n",
    "        return ADEX_MODEL, self.DEFAULT_PARAMETERS\n",
    "\n",
    "    def set_default(self, n_neuron):\n",
    "        model, parameters = self.create_model()\n",
    "\n",
    "        neurons = NeuronGroup(\n",
    "            n_neuron,\n",
    "            model=model,\n",
    "            method=\"Euler\",\n",
    "            name=\"neurons\",\n",
    "            threshold=\"v > v_thresh\",\n",
    "            reset=\"v = v_reset; w += b\",\n",
    "        )\n",
    "\n",
    "        for parameter, value in parameters.items():\n",
    "            neurons.__setattr__(parameter, value)\n",
    "\n",
    "        neurons.v = neurons.e_l  # remove most of transient\n",
    "\n",
    "        return neurons\n",
    "\n",
    "    def set_resistance(self, level):\n",
    "        if level == self.LOW:\n",
    "            exc_conductance = self.EXCITATORY_CONDUCTANCE\n",
    "            inhib_conductance = self.INHIBITORY_CONDUCTANCE\n",
    "\n",
    "        else:\n",
    "            exc_conductance = inhib_conductance = 0\n",
    "\n",
    "        self._input_resistance = level\n",
    "        self._set_variable(\"mu_ex\", exc_conductance)\n",
    "        self._set_variable(\"mu_in\", inhib_conductance)\n",
    "\n",
    "    def set_noise(self, level):\n",
    "        if level == self.HIGH or level == self.LOW:\n",
    "            exc_noise = self.EXCITATORY_NOISE_VARIANCE[level]\n",
    "            inhib_noise = self.INHIBITORY_NOISE_VARIANCE[level]\n",
    "\n",
    "        else:\n",
    "            exc_noise = inhib_noise = 0\n",
    "\n",
    "        self._noise_level = level\n",
    "        self._set_variable(\"sigma_ex\", exc_noise)\n",
    "        self._set_variable(\"sigma_in\", inhib_noise)\n",
    "\n",
    "    def set_injected_current(self, amplitude):\n",
    "        self._set_variable(\"i_injected\", amplitude)\n",
    "        self._set_variable(\"A\", 0 * pA)\n",
    "\n",
    "    def set_stimulus_current(self, amplitude):\n",
    "        self._set_variable(\"A\", amplitude)\n",
    "        self._set_variable(\"i_injected\", 0 * pA)\n",
    "\n",
    "    @property\n",
    "    def f(self):\n",
    "        return self.neurons.f\n",
    "\n",
    "    @f.setter\n",
    "    def f(self, new_f):\n",
    "        self._set_variable(\"f\", new_f)  # this will reset smon\n",
    "        if self.stim_type == self.EXP2SYN:\n",
    "            self.spiker.T = 1 / new_f\n",
    "\n",
    "    def run(self, duration, report=\"stdout\"):\n",
    "        self._duration = duration\n",
    "        self.network.run(duration, report=report)\n",
    "\n",
    "    def build_network(self):\n",
    "        self.smon = StateMonitor(\n",
    "            self.neurons, self.recorded_vars, record=True, name=\"smon\"\n",
    "        )\n",
    "        self.spikes = SpikeMonitor(self.neurons, name=\"spikes\")\n",
    "\n",
    "        self.network = Network(self.neurons, self.smon, self.spikes)\n",
    "\n",
    "    def _set_variable(self, name, value):\n",
    "        self.neurons.__setattr__(name, value)\n",
    "        self.reset_recording()\n",
    "\n",
    "    def reset_recording(self):\n",
    "        try:\n",
    "            self.network\n",
    "        except AttributeError:\n",
    "            return  # network not yet initialized\n",
    "\n",
    "        self.network.remove(self.smon, self.spikes)\n",
    "\n",
    "        self.smon = StateMonitor(\n",
    "            self.neurons, self.recorded_vars, record=True, name=\"smon\"\n",
    "        )\n",
    "        self.spikes = SpikeMonitor(self.neurons, name=\"spikes\")\n",
    "\n",
    "        self.network.add(self.smon, self.spikes)\n",
    "\n",
    "    @property\n",
    "    def spike_train(self):\n",
    "        return self.spikes.spike_trains()\n",
    "\n",
    "    @property\n",
    "    def firing_rate(self):\n",
    "        return self.spikes.count / self.duration\n",
    "\n",
    "    @property\n",
    "    def duration(self):\n",
    "        return self._duration\n",
    "\n",
    "    @property\n",
    "    def input_resistance(self):\n",
    "        if self._input_resistance == self.HIGH:\n",
    "            return \"HIGH\"\n",
    "        else:\n",
    "            return \"LOW\"\n",
    "\n",
    "    @property\n",
    "    def noise_level(self):\n",
    "        if self._noise_level == self.HIGH:\n",
    "            return \"HIGH\"\n",
    "        elif self._noise_level == self.LOW:\n",
    "            return \"LOW\"\n",
    "        else:\n",
    "            return \"NO\"\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"{self.neurons.N} Neurons with {self.input_resistance} input resistance and {self.noise_level} noise\"\n",
    "\n",
    "    def __str__(self):\n",
    "        return self.__repr__()\n",
    "\n",
    "    def store(self, name):\n",
    "        self.network.store(name)\n",
    "\n",
    "    def restore(self, name):\n",
    "        self.network.restore(name)\n",
    "\n",
    "    @property\n",
    "    def v(self):\n",
    "        return self.smon.v\n",
    "\n",
    "    @property\n",
    "    def t(self):\n",
    "        return self.smon.t\n",
    "\n",
    "    @property\n",
    "    def injected_current(self):\n",
    "        return self.neurons.i_injected\n",
    "\n",
    "    @property\n",
    "    def stimulus_amplitude(self):\n",
    "        return self.neurons.A\n",
    "\n",
    "\n",
    "class CurrentModel(Model):\n",
    "    def __init__(self, **kwargs):\n",
    "        super().__init__(stim=self.SINE, **kwargs)\n",
    "\n",
    "    def create_model(self):\n",
    "        model, parameters = super().create_model()\n",
    "        model += CURRENT_INPUT\n",
    "\n",
    "        return model, parameters\n",
    "\n",
    "\n",
    "class SineModel(CurrentModel):\n",
    "    def create_model(self):\n",
    "        model, parameters = super().create_model()\n",
    "        model += SINE_INPUT\n",
    "\n",
    "        return model, parameters\n",
    "\n",
    "\n",
    "class SawModel(CurrentModel):\n",
    "    def create_model(self):\n",
    "        model, parameters = super().create_model()\n",
    "        model += SAW_INPUT\n",
    "\n",
    "        return model, parameters\n",
    "\n",
    "\n",
    "class SynapticModel(Model):\n",
    "    def __init__(self, **kwargs):\n",
    "        super().__init__(stim=self.EXP2SYN, **kwargs)\n",
    "\n",
    "    SYNAPTIC_PARAMETERS = {\n",
    "        \"tau_input_1\": 0.4 * ms,\n",
    "        \"tau_input_2\": 4 * ms,\n",
    "        \"offset_A\": 1.48793507e-11,\n",
    "        \"offset_B\": -2.66359562e-08,\n",
    "        \"offset_C\": 1.77538800e-05,\n",
    "        \"offset_D\": -8.05925810e-04,\n",
    "        \"offset_E\": -3.51463644e-02,\n",
    "        \"offset_switch\": 0,\n",
    "    }\n",
    "\n",
    "    def create_model(self):\n",
    "        model, parameters = super().create_model()\n",
    "        model += EXP2SYN_WAVEFORM + SUMMATION_OFFSET\n",
    "        parameters = {**parameters, **self.SYNAPTIC_PARAMETERS}\n",
    "\n",
    "        return model, parameters\n",
    "\n",
    "    def build_network(self):\n",
    "        super().build_network()\n",
    "        self.spiker = NeuronGroup(\n",
    "            self.neurons.N,\n",
    "            \"\"\"T : second (constant)\n",
    "                                     lastspike : second\"\"\",\n",
    "            threshold=\"timestep(t-lastspike, dt)>=timestep(T, dt)\",\n",
    "            reset=\"lastspike=t\",\n",
    "        )\n",
    "        self.spiker.T = 1 / self.neurons.f\n",
    "        self.synapses = Synapses(\n",
    "            self.spiker, self.neurons, on_pre=\"input_aux += 1\"\n",
    "        )  # connect input to neurons\n",
    "        self.synapses.connect(\"i==j\")  # one synapse goes to one neuron\n",
    "\n",
    "        self.network.add(self.spiker, self.synapses)\n",
    "\n",
    "\n",
    "class SynapticCurrentModel(SynapticModel):\n",
    "    def __init__(self, offset=True, **kwargs):\n",
    "        self.offset = 1 if offset else 0\n",
    "        super().__init__(**kwargs)\n",
    "\n",
    "    def create_model(self):\n",
    "        model, parameters = super().create_model()\n",
    "        model += CURRENT_INPUT + SYNAPTIC_INPUT_CURRENT\n",
    "        parameters = {**parameters, **{\"offset_switch\": self.offset}}\n",
    "\n",
    "        return model, parameters\n",
    "\n",
    "\n",
    "class SynapticConductanceModel(SynapticModel):\n",
    "    FLAT = 0\n",
    "    ACTIVE = 1\n",
    "\n",
    "    CONDUCTANCE_PARAMETERS = {\n",
    "        \"A\": 0 * nS,  # overwrite A to be conductance\n",
    "        \"g_i\": 1 * nS,\n",
    "    }\n",
    "\n",
    "    INHIBITION_PARAMETERS = {\n",
    "        \"tau_inhibition_1\": 1 * ms,\n",
    "        \"tau_inhibition_2\": 10 * ms,\n",
    "    }\n",
    "\n",
    "    def __init__(self, offset=ACTIVE, **kwargs):\n",
    "        self.offset = offset\n",
    "        super().__init__(**kwargs)\n",
    "\n",
    "    def create_model(self):\n",
    "        model, parameters = super().create_model()\n",
    "        if self.offset == self.FLAT:\n",
    "            model += CONDUCTANCE_INPUT + SYNAPTIC_CONDUCTANCE_FLAT\n",
    "            parameters = {\n",
    "                **parameters,\n",
    "                **self.SYNAPTIC_PARAMETERS,\n",
    "                **self.CONDUCTANCE_PARAMETERS,\n",
    "                **{\"offset_switch\": 1},\n",
    "            }\n",
    "\n",
    "        elif self.offset == self.ACTIVE:\n",
    "            model += CONDUCTANCE_INPUT + SYNAPTIC_CONDUCTANCE_STIM\n",
    "            parameters = {\n",
    "                **parameters,\n",
    "                **self.SYNAPTIC_PARAMETERS,\n",
    "                **self.CONDUCTANCE_PARAMETERS,\n",
    "                **self.INHIBITION_PARAMETERS,\n",
    "            }\n",
    "\n",
    "        return model, parameters\n",
    "\n",
    "    def build_network(self):\n",
    "        super().build_network()\n",
    "        if self.offset != self.ACTIVE:\n",
    "            return\n",
    "\n",
    "        self.inhib_synapses = Synapses(\n",
    "            self.spiker, self.neurons, on_pre=\"input_inhib_aux += 1\", delay=2 * ms\n",
    "        )  # connect input to neurons\n",
    "        self.inhib_synapses.connect(\"i==j\")  # one synapse goes to one neuron\n",
    "\n",
    "        self.network.add(self.inhib_synapses)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "c82769f2",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING    Cannot use Cython, a test compilation failed: Microsoft Visual C++ 14.0 or greater is required. Get it with \"Microsoft C++ Build Tools\": https://visualstudio.microsoft.com/visual-cpp-build-tools/ (DistutilsPlatformError) [brian2.codegen.runtime.cython_rt.cython_rt.failed_compile_test]\n",
      "INFO       Cannot use compiled code, falling back to the numpy code generation target. Note that this will likely be slower than using compiled code. Set the code generation to numpy manually to avoid this message:\n",
      "prefs.codegen.target = \"numpy\" [brian2.devices.device.codegen_fallback]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting simulation at t=0. s for a duration of 12. s\n",
      "0.56697 s (4%) simulated in 10s, estimated 3m 22s remaining.\n",
      "1.14071 s (9%) simulated in 20s, estimated 3m 10s remaining.\n",
      "1.68119 s (14%) simulated in 30s, estimated 3m 4s remaining.\n",
      "2.20377 s (18%) simulated in 40s, estimated 2m 58s remaining.\n",
      "2.72235 s (22%) simulated in 50s, estimated 2m 50s remaining.\n",
      "3.23784 s (26%) simulated in 1m 0s, estimated 2m 42s remaining.\n",
      "3.75439 s (31%) simulated in 1m 10s, estimated 2m 34s remaining.\n",
      "4.27247 s (35%) simulated in 1m 20s, estimated 2m 25s remaining.\n",
      "4.79018 s (39%) simulated in 1m 30s, estimated 2m 15s remaining.\n",
      "5.29988 s (44%) simulated in 1m 40s, estimated 2m 6s remaining.\n",
      "5.80711 s (48%) simulated in 1m 50s, estimated 1m 57s remaining.\n",
      "6.32132 s (52%) simulated in 2m 0s, estimated 1m 48s remaining.\n",
      "6.83382 s (56%) simulated in 2m 10s, estimated 1m 38s remaining.\n",
      "7.33168 s (61%) simulated in 2m 20s, estimated 1m 29s remaining.\n",
      "7.83277 s (65%) simulated in 2m 30s, estimated 1m 20s remaining.\n",
      "8.34308 s (69%) simulated in 2m 40s, estimated 1m 10s remaining.\n",
      "8.85848 s (73%) simulated in 2m 50s, estimated 1m 0s remaining.\n",
      "9.37058 s (78%) simulated in 3m 0s, estimated 51s remaining.\n",
      "9.88401 s (82%) simulated in 3m 10s, estimated 41s remaining.\n",
      "10.39232 s (86%) simulated in 3m 20s, estimated 31s remaining.\n",
      "10.89568 s (90%) simulated in 3m 30s, estimated 21s remaining.\n",
      "11.4009 s (95%) simulated in 3m 40s, estimated 12s remaining.\n",
      "11.91171 s (99%) simulated in 3m 50s, estimated 2s remaining.\n",
      "12. s (100%) simulated in 3m 51s\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.collections.EventCollection at 0x2140563aa00>,\n",
       " <matplotlib.collections.EventCollection at 0x214056492e0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405649c10>,\n",
       " <matplotlib.collections.EventCollection at 0x2140564c460>,\n",
       " <matplotlib.collections.EventCollection at 0x2140564cd00>,\n",
       " <matplotlib.collections.EventCollection at 0x2140565b760>,\n",
       " <matplotlib.collections.EventCollection at 0x21405cf1370>,\n",
       " <matplotlib.collections.EventCollection at 0x21405cf1c40>,\n",
       " <matplotlib.collections.EventCollection at 0x21405cfa670>,\n",
       " <matplotlib.collections.EventCollection at 0x21405cfafd0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d01b20>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d0b4c0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d0be50>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d118b0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d183d0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d18cd0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d21490>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d21e20>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d2a880>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d30250>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d30b50>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d3a5b0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d3ae50>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d43610>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d43e20>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d4b5e0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d4bf70>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d53850>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d53fd0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d5a940>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d622e0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d62be0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d6c520>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d6cdc0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d74550>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d74e80>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d7d8b0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d822b0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d82ac0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d8b520>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d8bdc0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d93760>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d93eb0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405d9e880>,\n",
       " <matplotlib.collections.EventCollection at 0x21405da4220>,\n",
       " <matplotlib.collections.EventCollection at 0x21405da4dc0>,\n",
       " <matplotlib.collections.EventCollection at 0x21405dad670>,\n",
       " <matplotlib.collections.EventCollection at 0x21405dadf70>,\n",
       " <matplotlib.collections.EventCollection at 0x21405db5880>,\n",
       " <matplotlib.collections.EventCollection at 0x21405dbb340>]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXEAAAD4CAYAAAAaT9YAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAYx0lEQVR4nO3dbaxlV13H8d/fmZZioXbGzkyuLXFK0jQ2JFK8EiqGVIYCYkOrES0RHGN1TNQExIRO5YXyioKGEEMiTAAzKg+tPDiTCQqTQmNISOmd8NSnYcpTGbkyF2oo4Asp/H1x94HT03POXns97L3X4ftJJveeffbDWvvs+8/c3157XXN3AQDq9FNDNwAAEI8iDgAVo4gDQMUo4gBQMYo4AFRsZ58Hu+SSS3z//v19HhIAqnfq1Klvuvueee/1WsT379+vjY2NPg8JANUzs68ueo84BQAqRhEHgIpRxAGgYhRxAKgYRRwAKhY0OsXMviLpO5J+IOkxd183s92Sbpe0X9JXJP2Ou/9PmWYCAObp8j/xX3P3Z7r7evP6sKQ73f0KSXc2rwEAPUqJU26QdLT5/qikG5NbAwDoJLSIu6SPmtkpMzvULNvn7puS1HzdO29DMztkZhtmtrG1tZXeYgDAj4Q+sflcd/+6me2VdNLMHgw9gLsfkXREktbX1/kLFACQUVARd/evN1/PmdmHJD1b0jfMbM3dN81sTdK5Uo383bd/UpJ0+59c87jXE5PlMftYtO3sMRbpur+QtqZsk1PIeV7WxpjPqa0tXfeR+xwO/ZnkMOY+hLYtVx+61oHp9dqu777Oc2ucYmYXmtlTJ99LeqGkeyUdl3SwWe2gpGOlGgkAmC/kf+L7JH3IzCbrv8fd/8PM7pF0h5ndLOlhSS8r10wAwDytRdzdvyTpF+cs/5akAyUaBQAIY33+tfv19XWPnYp2UUY9L6NqW5Zi6DyxRPbe9ZjTr1Nz85D3u7RtUftKno8c+5h3HkP6EXJu7998VFetXRS8z5x9CN0m5tpY1pcc91By5fM5rhczOzX1jM7j8Ng9AFSMIg4AFaOIA0DFqsjEc2ZOpcahhmZ3KccYQqk2huy3xD2Ots9iIuSzSlkW285F7+cck9+lbdOZ+/SxQ/LqPtraRd9j1LsgEweAFUURB4CKUcQBoGLVZuKLMrcu2XToPobIwEqO541dJ1Yf5y/1fMXeV8lxLyTHXEBd+9BV3z8Tpe8jxZy/IesCmTgArCiKOABUjCIOABWrNhNve6+vOVOWZWsTYxgHG5r5D3XeQnP76XlAUtuQQ2xOukr3IHLvL+SaKT0/TmxbS7WFTBwAVhRFHAAqRhEHgIpVmYnHzDHcZWzvstw1xxwbXefcWHSsRWLz5phjdWnHovdK5ZtdxgL3PZY+9jpNzdwXzXvS9Rx1vV5Kj90fQsgcMrmQiQPAiqKIA0DFqotTUh5ZDvn1ftl+Sg0n6vq4b+zyHIYc2jWvHRO5H5UufQ67DpUs1Z4+pnQI2S7HdZUau06k/jyV+KyIUwBgRVHEAaBiFHEAqFh1mfiyZbm2Tx3uF5Lbp+RmuTLD0HX7OF7odrmHAvY5vWipexi5hqKGtjF3hhy7Tc595x5im7s/ZOIAsKIo4gBQMYo4AFSsyky8j7HKXY7R9TH6Psfkljg/ffW37ZhDyjHePGcO22e2X6PYGjKW80gmDgAriiIOABULLuJmtsPMPm1mJ5rXu83spJmdab7uKtdMAMA8wZm4mb1G0rqki9z9ejN7k6RH3P02MzssaZe737JsH7GZuBQ3Png6c+wyV0Wf+W7svCmxx5wocT9hyFw2x2cWOo47xzS6fc27k3O/KfeicpynrnPO9HH99fXzm5yJm9llkn5D0jumFt8g6Wjz/VFJNya0EQAQITROeYuk10r64dSyfe6+KUnN173zNjSzQ2a2YWYbW1tbKW0FAMxoLeJmdr2kc+5+KuYA7n7E3dfdfX3Pnj0xuwAALNCaiZvZGyS9UtJjki6QdJGkD0r6ZUnXuvumma1Jusvdr1y2r5Rx4rNZWF/jbxftO9e8Hjkys77nE8kxJ0rpLHEs43tT9ZW55mpPl+1ix9p3vXcxETsXUpe2lZKUibv7re5+mbvvl3STpI+5+yskHZd0sFntoKRjmdoLAAiUMk78NknXmdkZSdc1rwEAPdrZZWV3v0vSXc3335J0IH+TAAChqpo7ZSJ0rGmJsbhd/27f0POcxO6/j/lp2o6be38h11GX+bS7jBNPmWtlbHPQpI6Tb9tm6PsAXbL0WaXaxNwpALCiKOIAUDGKOABUrKpMPPe45S7HzTnONXZ5zDFySL3/0McY4SGNoU2Lsto+7q/kuH/S5frp63yX6EssMnEAWFEUcQCoGEUcACpWVSa+SB9jxUOMbR6LkCwxNttMHR8c2ocuZufYGWJ+75z77iNfXvTeonm8Z41pfPcisfeexjR/OZk4AKwoijgAVKyKOGWe1F81J1IeQc89FLDr9AK5Io0uxjCcbpmc5yEk/hly+GiOvqb8HM1GLKnX1Ox+Sk2tUfKx/1LTVRCnAMCKoogDQMUo4gBQsSoy8bbpRGP3FbLeIjkz4diMLiVL7Nqu2O1S2jKWR+5L3H8JeW+s9x26ynl/IFcb2nLtZUMLY4fipiATB4AVRREHgIpRxAGgYtVl4vNeL1ov1liy2NLHHmP22vVR5+ntpDzZ8hDnZUyfRcz1H3sfJMfnljLWe2Ls9yTIxAFgRVHEAaBiFHEAqFiVmXiMEvNHhBwrZ1bYl9Apayf6+BNgJdZv29dsNh+b16e2c0zXQttnv2gK25Cfu1L97CNjTz1mGzJxAFhRFHEAqBhFHAAqVkUmPlE6G1+0Tl9jtfvKmhcdv+s6ucZhL8sgJ9ryya7ZbWxbcyo193SX4y5bFrOf2LZMpBw/xzwmuX8emTsFALAURRwAKtZaxM3sAjP7lJl91szuM7PXN8t3m9lJMzvTfN1VvrkAgGmtmbiZmaQL3f27ZnaepE9IepWk35L0iLvfZmaHJe1y91uW7SvnfOIlxnR3eS90nS652tC5aMp2JcfAD3Ve+h6fvWxcdZfMP/b8zttXF6XuWXUZmx57vNl9x17Ppa6ZpEzct323eXle888l3SDpaLP8qKQb05sKAOgiKBM3sx1m9hlJ5ySddPe7Je1z901Jar7uXbDtITPbMLONra2tTM0GAEiBRdzdf+Duz5R0maRnm9kzQg/g7kfcfd3d1/fs2RPZTADAPJ3HiZvZX0v6nqQ/lnStu2+a2Zqku9z9ymXbDjl3Sg6hed2ysaazxjZndWrW2paZT++3xPzvOcf4dxnP3se9jqHGcqccJ3bsdtu5H+KZill91qWkTNzM9pjZxc33T5b0AkkPSjou6WCz2kFJx7K0FgAQbGfAOmuSjprZDm0X/Tvc/YSZfVLSHWZ2s6SHJb2sYDsBAHO0FnF3/5ykq+cs/5akAyUaBQAIU8XcKYty5UW56pBjfdvkGE+dOva8zxw3ZZ/LPvfYY8Zm5qXPR9s1m2u+k67taluee8x/7ucXcu2/1H5CMXcKAKwoijgAVKyKOGWRlF87Q35lTHkkP/Vx/pT1u2j7E1o59i/VE2eNIUYqvc++zkFqrNlHO3P+nJZEnAIAK4oiDgAVo4gDQMWqyMRjpqds237R+zFDvULlHPqYI8tLycPHkBfGDNeU9Lg+h57HPqfgLZl3D6nkdMWpbRjDY/zLkIkDwIqiiANAxSjiAFCx6jLxmGlHc05Puqx9s2KnfM3Rlj4eP+7zUfDUNsxeN4ty8RLjhkPvyUyUuk6HkDrVQsq5Ljn9cdsxc39mZOIAsKIo4gBQMYo4AFSsikxcyptHjmGq2tB2TQw5tjbEEOe51jG/03KelxLzk4xZ23MOMVMux96/KI1MHABWFEUcACpGEQeAilWRifeV240hK8+hz3y69J/T+kkSM+/9RJex5aXvt4TkzLFzhff1fEPM8yiz+5rIcY2TiQPAiqKIA0DFKOIAULEqMnHpiWNCu8yLsEpzUwzx9xFzrpuyTZ9KzvdeYvuxnc++5wNftE6OezZ9HXMZMnEAWFEUcQCoGEUcACpWVSYu9TtWvHQ7Quaungj9G5Cz64fMxd5lXHmf56dt/zFziY9Vn3PLpOxrIiarj52rfeg58seATBwAVlRrETezp5nZx83sATO7z8xe1SzfbWYnzexM83VX+eYCAKaF/E/8MUl/6e6/IOk5kv7MzK6SdFjSne5+haQ7m9cAgB51zsTN7Jiktzb/rnX3TTNbk3SXu1+5bNuUTHxWyewzRwYXOja9dJuHHO+aM0tvmzs6ZB+hbU1ZZ956i17P6nrOc9yfWJZ1l7pWQ9qZkpH3maH3td9smbiZ7Zd0taS7Je1z901Jar7uTWwnAKCj4CJuZk+R9AFJr3b3Rztsd8jMNsxsY2trK6aNAIAFguIUMztP0glJH3H3NzfLTqvHOKVtiFOOX6VD9z3WYUh962O4YZdpTSdipmUdclreRftomx61a7wUEm+lRhGxcdCQwwNTruO+akFSnGJmJumdkh6YFPDGcUkHm+8PSjqW2lAAQDc7A9Z5rqRXSvq8mX2mWfZXkm6TdIeZ3SzpYUkvK9JCAMBCrUXc3T8hyRa8fSBvcwAAXVTx2H2px76HeNQ5x7StocPCQrO8XFPJlswHc+WSY7q/kfr5DD2ULvQ4XYYxdtlvSlu6XPdd7sOktnsRHrsHgBVFEQeAilHEAaBiVWXiE2PKL7tOBxtyjFkx+W3stLOLlnXJkkM/r3nrxbSlrT3Ljt3HtVTTcwU57qPkzPNz63pdj+W+A5k4AKwoijgAVIwiDgAVqyIT76LEuNOhp6xMHSM9RPu7ZqYTXcfXx453T7kG2u5dzNtu2Tq5tN0r6JJP557XJEbKfEm5r5cu7S0xZpxMHABWFEUcACpGEQeAilWTiY99rO0Y2heTCU/0Pd9Jaalj9pftbzKP9+y+c8o5X0jIOiXm/AnR9bip7Ui9bzLUvQIycQBYURRxAKgYRRwAKlZlJj7037zLkYvlGN8dM39Fl7lJJoaeR6LEcVPGIC97v8/rbyL0Gio5jj5Wrp+fMdx/KXk/gUwcAFYURRwAKkYRB4CKVZGJp+bHs7ngZJzvvJwwdT7hia77m7fedDtD+tll/6lyjLeebJ8jF80xF0qf471Tj9/lPkeX+deHGAedcpzY+yDLakCJdqYiEweAFUURB4CKUcQBoGLVZeI55gIfw1jemLmdJc3NyWe367rvmHxwkZzndqjPLlSXfD9XZh97j6XtGDFtTD1+ju1T2phL7P2HLsjEAWBFUcQBoGJVxCkTXX9FLDF0rfQjtjmHUy57L0csNfv+bNTT5yPfff7KnHO7XO3O8Wt8X30MneZh2Xt9D4UcOtojTgGAFUURB4CKtRZxM3uXmZ0zs3unlu02s5Nmdqb5uqtsMwEA87Rm4mb2PEnflfRP7v6MZtmbJD3i7reZ2WFJu9z9lraD5ZiKdiJ1etbY46cMFYw9TonsrcuQxIm+HmlvG2Y5/V5fQ+km2y0a4pkiV3Y9huGXuX7Gclx7Ie0pcc+ixOeQlIm7+39KemRm8Q2SjjbfH5V0Y0oDAQBxYjPxfe6+KUnN172LVjSzQ2a2YWYbW1tbkYcDAMxT/Mamux9x93V3X9+zZ0/pwwHAT5SgceJmtl/SialM/LSka91908zWJN3l7le27SfnVLSxmVnIPvvIFEPyv5JjiHPsa7bdi5SaYrRLnlliDHSJ7H/e8tj7QSH5cOr9kC7nINezArH7WXS95r5/VkKJceLHJR1svj8o6VjkfgAACUKGGL5X0iclXWlmZ83sZkm3SbrOzM5Iuq55DQDo2c62Fdz95QveOpC5LQCAjqqYO6VrPpZj3G3XKT8ncmTsIVOctrV5iPwxZv2YbXPklSXG/7Zlrn2c57FluSGGHIudaz6h0nO5MHcKAKwoijgAVIwiDgAVqyITn1Vy7G4JseN+2/azaFnMfmLXW5YDx3xOKVlvrpw4x1wrXe+pjHk+n5TjzZtrJvUe11h+rif6aB+ZOACsKIo4AFSMIg4AFasiEy+VBeecH7przp2So6XMidH1WKHblMgB+x4P3kfGPLY8N1XM3CkTXe6bLHs9vb+ubU5Zp09k4gCwoijiAFAxijgAVKyKTHwiJAMLzej6njtjWbtCs8KuY2i75tgxmeayY6bk6H1k7F2vp0XL+x5/nSLkM4zZX8nzEPp+yHqp7030Mb/PNDJxAFhRFHEAqBhFHAAqVkUmXssc1cv2OxGb9+XK6/o4HzE5aWqWniPTDd3PvLYukut6ynX/YIifh2Xna95nOO+9kDbG3Fvoss2QY8fJxAFgRVHEAaBiKxGnpP4K3PZrXts+522T87H61P0NJeeQrdBjpE5JkHLstn2XPG6pY+XQ15QMfcSupbZvQ5wCACuKIg4AFaOIA0DFqsvEu2ZPpbPkobLHLnl86L5yZdcxQ/CGzDNj5XzkPPa4816XOEbMdn0PU+1bn+0iEweAFUURB4CKUcQBoGLVZeJd1uvyOmfO2PYo70SJLK3GbDmlHaGPTZfu25DHy3kPpMv2E6HPb4xh+oyuj+pPtNUIxokDAKJQxAGgYklF3MxebGanzewhMzucq1EAgDDRmbiZ7ZD0BUnXSTor6R5JL3f3+xdtk/rn2WaVHvPdNn76/s1HddXaRQvHaPcxd8g8Oc5LyYwvJd8sMcdF188sd6Y7hnMdul2fU7SOeY6Ytp/f3D/fpTLxZ0t6yN2/5O7/J+l9km5I2B8AoKOUIn6ppK9NvT7bLHscMztkZhtmtrG1tZVwOADArJQibnOWPSGbcfcj7r7u7ut79uxJOBwAYFZKJn6NpL9x9xc1r2+VJHd/w6JtcmfiAPCToFQmfo+kK8zscjM7X9JNko4n7A8A0NHO2A3d/TEz+3NJH5G0Q9K73P2+bC0DALSKLuKS5O4flvThTG0BAHTEE5sAUDGKOABUjCIOABWjiANAxSjiAFAxijgAVIwiDgAVo4gDQMV6/RubZrYl6auRm18i6ZsZmzOkVenLqvRDoi9jRV+2/by7z51BsNcinsLMNhZNAFObVenLqvRDoi9jRV/aEacAQMUo4gBQsZqK+JGhG5DRqvRlVfoh0Zexoi8tqsnEAQBPVNP/xAEAMyjiAFCx0RdxM3uxmZ02s4fM7PDQ7ZnHzJ5mZh83swfM7D4ze1WzfLeZnTSzM83XXVPb3Nr06bSZvWhq+S+Z2eeb9/7ezOb9QerS/dlhZp82sxOV9+NiM3u/mT3YfDbXVNyXv2iurXvN7L1mdkEtfTGzd5nZOTO7d2pZtrab2ZPM7PZm+d1mtr/nvvxtc419zsw+ZGYX99oXdx/tP23/2bcvSnq6pPMlfVbSVUO3a0471yQ9q/n+qZK+IOkqSW+SdLhZfljSG5vvr2r68iRJlzd93NG89ylJ10gySf8u6dcH6M9rJL1H0onmda39OCrpj5rvz5d0cY19kXSppC9LenLz+g5Jf1BLXyQ9T9KzJN07tSxb2yX9qaS3Nd/fJOn2nvvyQkk7m+/f2Hdfev2hijhh10j6yNTrWyXdOnS7Atp9TNJ1kk5LWmuWrUk6Pa8f2v47pdc06zw4tfzlkt7ec9svk3SnpOfrx0W8xn5cpO3CZzPLa+zLpZK+Jmm3tv+k4ommcFTTF0n7ZwpftrZP1mm+36ntpyKtr77MvPebkt7dZ1/GHqdMLt6Js82y0Wp+/bla0t2S9rn7piQ1X/c2qy3q16XN97PL+/QWSa+V9MOpZTX24+mStiT9YxMNvcPMLlSFfXH3/5L0d5IelrQp6dvu/lFV2JcpOdv+o23c/TFJ35b0s8Vavtwfavt/1o9rV6NIX8ZexOfldaMdE2lmT5H0AUmvdvdHl606Z5kvWd4LM7te0jl3PxW6yZxlg/ejsVPbv/b+g7tfLel72v61fZHR9qXJi2/Q9q/kPyfpQjN7xbJN5iwbRV8CxLR9FP0ys9dJekzSuyeL5qyWvS9jL+JnJT1t6vVlkr4+UFuWMrPztF3A3+3uH2wWf8PM1pr31ySda5Yv6tfZ5vvZ5X15rqSXmtlXJL1P0vPN7F9UXz/UtOGsu9/dvH6/tot6jX15gaQvu/uWu39f0gcl/Yrq7MtEzrb/aBsz2ynpZyQ9Uqzlc5jZQUnXS/o9b7IQ9dSXsRfxeyRdYWaXm9n52g76jw/cpido7iy/U9ID7v7mqbeOSzrYfH9Q21n5ZPlNzZ3oyyVdIelTza+V3zGz5zT7/P2pbYpz91vd/TJ336/tc/0xd39Fbf1o+vLfkr5mZlc2iw5Iul8V9kXbMcpzzOynmzYckPSA6uzLRM62T+/rt7V93fb5G+yLJd0i6aXu/r9Tb/XTlz5uaiTeRHiJtkd7fFHS64Zuz4I2/qq2f+X5nKTPNP9eou0s605JZ5qvu6e2eV3Tp9OaGiEgaV3Svc17b1XBGzQtfbpWP76xWWU/JD1T0kbzufybpF0V9+X1kh5s2vHP2h7xUEVfJL1X21n+97X9P82bc7Zd0gWS/lXSQ9oe9fH0nvvykLZz7MnP/tv67AuP3QNAxcYepwAAlqCIA0DFKOIAUDGKOABUjCIOABWjiANAxSjiAFCx/wdCp7l3AgKF9gAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#from models import Model, SynapticConductanceModel\n",
    "from brian2 import *\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "model = SynapticConductanceModel(resistance=Model.LOW, # Model.LOW, Model.HIGH\n",
    "                                 noise=Model.LOW, n=50, # Model.OFF, Model.LOW, Model,HIGH\n",
    "                                 offset=SynapticConductanceModel.ACTIVE)\n",
    "\n",
    "\n",
    "# model = SineModel(resistance=Model.LOW, # Model.LOW, Model.HIGH\n",
    "#                                   noise=Model.OFF, n=1, # Model.OFF, Model.LOW, Model,HIGH\n",
    "#                                 )\n",
    "\n",
    "\n",
    "model.f = 200 * Hz\n",
    "model.set_stimulus_current(400 * nS) # current should be scaled by 100x for Active Offset so (500nS is actually 5nS)\n",
    "model._set_variable(\"i_injected\", 65 * pA)\n",
    "\n",
    "\n",
    "model.run(12*second)\n",
    "\n",
    "spike_times = [s/ms for s in model.spike_train.values()]\n",
    "\n",
    "plt.eventplot(spike_times)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "7f22e21e",
   "metadata": {},
   "outputs": [],
   "source": [
    "#print(spike_times)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "20e3191c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import scipy.io\n",
    "import numpy as np\n",
    "\n",
    "\n",
    "file_path = 'data0.mat'\n",
    "scipy.io.savemat(file_path, {'data0': spike_times[0]})\n",
    "\n",
    "file_path = 'data1.mat'\n",
    "scipy.io.savemat(file_path, {'data1': spike_times[1]})\n",
    "\n",
    "file_path = 'data2.mat'\n",
    "scipy.io.savemat(file_path, {'data2': spike_times[2]})\n",
    "\n",
    "file_path = 'data3.mat'\n",
    "scipy.io.savemat(file_path, {'data3': spike_times[3]})\n",
    "\n",
    "file_path = 'data4.mat'\n",
    "scipy.io.savemat(file_path, {'data4': spike_times[4]})\n",
    "\n",
    "file_path = 'data5.mat'\n",
    "scipy.io.savemat(file_path, {'data5': spike_times[5]})\n",
    "\n",
    "file_path = 'data6.mat'\n",
    "scipy.io.savemat(file_path, {'data6': spike_times[6]})\n",
    "\n",
    "file_path = 'data7.mat'\n",
    "scipy.io.savemat(file_path, {'data7': spike_times[7]})\n",
    "\n",
    "file_path = 'data8.mat'\n",
    "scipy.io.savemat(file_path, {'data8': spike_times[8]})\n",
    "\n",
    "file_path = 'data9.mat'\n",
    "scipy.io.savemat(file_path, {'data9': spike_times[9]})\n",
    "\n",
    "file_path = 'data10.mat'\n",
    "scipy.io.savemat(file_path, {'data10': spike_times[10]})\n",
    "\n",
    "file_path = 'data11.mat'\n",
    "scipy.io.savemat(file_path, {'data11': spike_times[11]})\n",
    "\n",
    "file_path = 'data12.mat'\n",
    "scipy.io.savemat(file_path, {'data12': spike_times[12]})\n",
    "\n",
    "file_path = 'data13.mat'\n",
    "scipy.io.savemat(file_path, {'data13': spike_times[13]})\n",
    "\n",
    "file_path = 'data14.mat'\n",
    "scipy.io.savemat(file_path, {'data14': spike_times[14]})\n",
    "\n",
    "file_path = 'data15.mat'\n",
    "scipy.io.savemat(file_path, {'data15': spike_times[15]})\n",
    "\n",
    "file_path = 'data16.mat'\n",
    "scipy.io.savemat(file_path, {'data16': spike_times[16]})\n",
    "\n",
    "file_path = 'data17.mat'\n",
    "scipy.io.savemat(file_path, {'data17': spike_times[17]})\n",
    "\n",
    "file_path = 'data18.mat'\n",
    "scipy.io.savemat(file_path, {'data18': spike_times[18]})\n",
    "\n",
    "file_path = 'data19.mat'\n",
    "scipy.io.savemat(file_path, {'data19': spike_times[19]})\n",
    "\n",
    "file_path = 'data20.mat'\n",
    "scipy.io.savemat(file_path, {'data20': spike_times[20]})\n",
    "\n",
    "file_path = 'data21.mat'\n",
    "scipy.io.savemat(file_path, {'data21': spike_times[21]})\n",
    "\n",
    "file_path = 'data22.mat'\n",
    "scipy.io.savemat(file_path, {'data22': spike_times[22]})\n",
    "\n",
    "file_path = 'data23.mat'\n",
    "scipy.io.savemat(file_path, {'data23': spike_times[23]})\n",
    "\n",
    "file_path = 'data24.mat'\n",
    "scipy.io.savemat(file_path, {'data24': spike_times[24]})\n",
    "\n",
    "file_path = 'data25.mat'\n",
    "scipy.io.savemat(file_path, {'data25': spike_times[25]})\n",
    "\n",
    "file_path = 'data26.mat'\n",
    "scipy.io.savemat(file_path, {'data26': spike_times[26]})\n",
    "\n",
    "file_path = 'data27.mat'\n",
    "scipy.io.savemat(file_path, {'data27': spike_times[27]})\n",
    "\n",
    "file_path = 'data28.mat'\n",
    "scipy.io.savemat(file_path, {'data28': spike_times[28]})\n",
    "\n",
    "file_path = 'data29.mat'\n",
    "scipy.io.savemat(file_path, {'data29': spike_times[29]})\n",
    "\n",
    "file_path = 'data30.mat'\n",
    "scipy.io.savemat(file_path, {'data30': spike_times[30]})\n",
    "\n",
    "file_path = 'data31.mat'\n",
    "scipy.io.savemat(file_path, {'data31': spike_times[31]})\n",
    "\n",
    "file_path = 'data32.mat'\n",
    "scipy.io.savemat(file_path, {'data32': spike_times[32]})\n",
    "\n",
    "file_path = 'data33.mat'\n",
    "scipy.io.savemat(file_path, {'data33': spike_times[33]})\n",
    "\n",
    "file_path = 'data34.mat'\n",
    "scipy.io.savemat(file_path, {'data34': spike_times[34]})\n",
    "\n",
    "file_path = 'data35.mat'\n",
    "scipy.io.savemat(file_path, {'data35': spike_times[35]})\n",
    "\n",
    "file_path = 'data36.mat'\n",
    "scipy.io.savemat(file_path, {'data36': spike_times[36]})\n",
    "\n",
    "file_path = 'data37.mat'\n",
    "scipy.io.savemat(file_path, {'data37': spike_times[37]})\n",
    "\n",
    "file_path = 'data38.mat'\n",
    "scipy.io.savemat(file_path, {'data38': spike_times[38]})\n",
    "\n",
    "file_path = 'data39.mat'\n",
    "scipy.io.savemat(file_path, {'data39': spike_times[39]})\n",
    "\n",
    "file_path = 'data40.mat'\n",
    "scipy.io.savemat(file_path, {'data40': spike_times[40]})\n",
    "\n",
    "file_path = 'data41.mat'\n",
    "scipy.io.savemat(file_path, {'data41': spike_times[41]})\n",
    "\n",
    "file_path = 'data42.mat'\n",
    "scipy.io.savemat(file_path, {'data42': spike_times[42]})\n",
    "\n",
    "file_path = 'data43.mat'\n",
    "scipy.io.savemat(file_path, {'data43': spike_times[43]})\n",
    "\n",
    "file_path = 'data44.mat'\n",
    "scipy.io.savemat(file_path, {'data44': spike_times[44]})\n",
    "\n",
    "file_path = 'data45.mat'\n",
    "scipy.io.savemat(file_path, {'data45': spike_times[45]})\n",
    "\n",
    "file_path = 'data46.mat'\n",
    "scipy.io.savemat(file_path, {'data46': spike_times[46]})\n",
    "\n",
    "file_path = 'data47.mat'\n",
    "scipy.io.savemat(file_path, {'data47': spike_times[47]})\n",
    "\n",
    "file_path = 'data48.mat'\n",
    "scipy.io.savemat(file_path, {'data48': spike_times[48]})\n",
    "\n",
    "file_path = 'data49.mat'\n",
    "scipy.io.savemat(file_path, {'data49': spike_times[49]})\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d353eff4",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}