{
 "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\" : 0*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": {},
   "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 3. s\n",
      "0.85419 s (28%) simulated in 10s, estimated 25s remaining.\n",
      "1.68785 s (56%) simulated in 20s, estimated 16s remaining.\n",
      "2.47202 s (82%) simulated in 30s, estimated 6s remaining.\n",
      "3. s (100%) simulated in 36s\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.collections.EventCollection at 0x1eb2a94d550>,\n",
       " <matplotlib.collections.EventCollection at 0x1eb2a95d310>,\n",
       " <matplotlib.collections.EventCollection at 0x1eb2a965070>,\n",
       " <matplotlib.collections.EventCollection at 0x1eb2a965df0>,\n",
       " <matplotlib.collections.EventCollection at 0x1eb2a96eb20>,\n",
       " <matplotlib.collections.EventCollection at 0x1eb2a974850>,\n",
       " <matplotlib.collections.EventCollection at 0x1eb2a97b520>,\n",
       " <matplotlib.collections.EventCollection at 0x1eb2a9812b0>,\n",
       " <matplotlib.collections.EventCollection at 0x1eb2a981fd0>,\n",
       " <matplotlib.collections.EventCollection at 0x1eb2a98cd00>]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\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.OFF, n=1, # 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.HIGH, n=10, # Model.OFF, Model.LOW, Model,HIGH\n",
    "                                )\n",
    "\n",
    "\n",
    "model.f = 100 * Hz\n",
    "model.set_stimulus_current(50 * pA) # current should be scaled by 100x for Active Offset so (500nS is actually 5nS)\n",
    "model._set_variable(\"i_injected\", 120 * pA)\n",
    "\n",
    "\n",
    "model.run(3*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": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[array([  10.53,   84.06,  122.16,  162.1 ,  203.21,  313.54,  363.64,\n",
      "        442.51,  493.89,  532.12,  573.88,  611.08,  659.28,  701.96,\n",
      "        752.5 ,  811.62,  853.91,  943.42,  984.44, 1062.16, 1102.68,\n",
      "       1143.16, 1182.51, 1222.99, 1275.2 , 1315.64, 1383.96, 1444.26,\n",
      "       1492.88, 1531.65, 1582.92, 1669.76, 1724.19, 1774.72, 1812.86,\n",
      "       1854.73, 1901.34, 1944.99, 2012.42, 2072.53, 2113.84, 2165.32,\n",
      "       2211.37, 2262.12, 2325.01, 2372.57, 2418.14, 2464.66, 2536.63,\n",
      "       2583.97, 2652.56, 2702.32, 2792.96, 2882.73, 2940.82, 2972.46]), array([  17.82,   61.78,  112.63,  162.54,  205.06,  240.57,  285.4 ,\n",
      "        332.77,  374.83,  423.75,  472.6 ,  522.03,  604.42,  654.63,\n",
      "        709.31,  755.85,  822.88,  892.28,  932.79, 1011.51, 1071.04,\n",
      "       1135.8 , 1191.67, 1232.64, 1286.04, 1333.18, 1404.14, 1453.45,\n",
      "       1502.86, 1565.92, 1625.68, 1683.01, 1721.26, 1764.25, 1812.97,\n",
      "       1884.35, 1932.49, 1964.44, 2014.07, 2082.58, 2152.98, 2192.83,\n",
      "       2242.22, 2282.44, 2334.25, 2382.13, 2473.08, 2553.47, 2605.16,\n",
      "       2672.88, 2743.5 , 2833.78, 2877.56, 2940.63, 2983.13]), array([  16.23,   54.11,   94.2 ,  129.66,  184.21,  242.74,  295.51,\n",
      "        363.25,  403.11,  444.54,  491.51,  562.51,  632.22,  684.64,\n",
      "        722.34,  791.78,  834.51,  883.48,  941.27,  995.22, 1048.29,\n",
      "       1104.03, 1174.39, 1235.27, 1291.34, 1343.1 , 1403.99, 1464.02,\n",
      "       1520.21, 1573.38, 1623.42, 1674.57, 1725.27, 1774.56, 1834.04,\n",
      "       1894.54, 1962.59, 2022.43, 2062.48, 2102.01, 2152.13, 2213.64,\n",
      "       2251.31, 2294.46, 2374.74, 2423.17, 2465.82, 2509.44, 2571.76,\n",
      "       2605.58, 2649.33, 2713.77, 2755.09, 2802.99, 2866.03, 2917.98,\n",
      "       2980.78]), array([   9.91,   54.98,  112.41,  155.29,  211.19,  260.75,  304.34,\n",
      "        344.92,  385.1 ,  452.7 ,  502.28,  552.3 ,  634.3 ,  694.66,\n",
      "        753.86,  794.63,  841.66,  902.92,  942.51, 1023.44, 1101.88,\n",
      "       1173.96, 1242.42, 1293.14, 1383.04, 1474.91, 1513.27, 1555.12,\n",
      "       1602.13, 1644.  , 1681.91, 1731.5 , 1774.53, 1815.28, 1895.59,\n",
      "       1973.34, 2041.03, 2105.34, 2155.15, 2194.35, 2253.93, 2336.62,\n",
      "       2385.89, 2424.38, 2461.25, 2525.73, 2581.79, 2634.39, 2752.07,\n",
      "       2793.16, 2863.18, 2908.5 , 2954.47, 2997.19]), array([  11.06,   63.75,  113.2 ,  202.98,  258.12,  295.42,  342.9 ,\n",
      "        432.53,  483.36,  532.05,  579.41,  625.54,  684.15,  776.62,\n",
      "        823.65,  872.85,  914.88,  963.3 , 1012.11, 1063.75, 1151.63,\n",
      "       1213.43, 1253.77, 1353.73, 1394.86, 1435.32, 1480.87, 1520.6 ,\n",
      "       1573.5 , 1623.58, 1681.28, 1743.34, 1782.16, 1843.06, 1891.83,\n",
      "       1953.14, 2017.48, 2064.07, 2113.03, 2161.33, 2225.04, 2262.24,\n",
      "       2314.59, 2363.86, 2403.99, 2492.63, 2543.3 , 2585.26, 2622.43,\n",
      "       2681.14, 2754.13, 2811.94, 2894.13, 2942.25]), array([   9.99,   43.54,  133.23,  176.25,  221.22,  291.28,  341.9 ,\n",
      "        402.72,  453.34,  493.5 ,  551.48,  630.49,  661.33,  721.61,\n",
      "        773.96,  831.94,  876.06,  913.91, 1023.88, 1063.68, 1121.46,\n",
      "       1182.78, 1233.21, 1313.02, 1348.91, 1403.95, 1453.83, 1533.21,\n",
      "       1572.69, 1611.87, 1683.4 , 1743.  , 1794.2 , 1865.88, 1924.31,\n",
      "       1991.63, 2061.33, 2113.13, 2252.11, 2322.93, 2374.28, 2431.82,\n",
      "       2481.93, 2542.88, 2594.72, 2635.59, 2702.36, 2760.9 , 2815.57,\n",
      "       2851.38, 2892.78, 2941.8 ]), array([  13.26,   54.64,  106.99,  161.16,  211.63,  274.1 ,  312.91,\n",
      "        382.55,  434.43,  493.81,  544.7 ,  603.  ,  655.08,  702.91,\n",
      "        782.92,  831.49,  884.59,  933.47,  973.61, 1024.58, 1141.53,\n",
      "       1185.06, 1251.17, 1313.41, 1375.89, 1423.32, 1474.72, 1533.54,\n",
      "       1574.81, 1645.35, 1691.45, 1761.6 , 1800.11, 1849.6 , 1904.31,\n",
      "       1962.97, 2053.82, 2104.49, 2153.39, 2204.94, 2241.14, 2283.43,\n",
      "       2323.  , 2392.24, 2427.19, 2472.35, 2521.28, 2572.91, 2624.18,\n",
      "       2693.82, 2744.65, 2802.11, 2846.84, 2883.26, 2933.69, 2992.68]), array([  13.09,   64.23,  103.74,  150.24,  222.76,  265.07,  333.05,\n",
      "        374.87,  442.27,  481.57,  541.01,  578.16,  630.6 ,  681.58,\n",
      "        731.06,  773.79,  831.66,  913.44,  972.16, 1023.04, 1065.55,\n",
      "       1132.41, 1172.14, 1232.04, 1272.21, 1313.07, 1443.09, 1513.12,\n",
      "       1582.3 , 1624.15, 1664.07, 1735.98, 1782.73, 1833.3 , 1882.43,\n",
      "       1943.88, 1991.7 , 2033.29, 2081.74, 2132.71, 2212.73, 2274.25,\n",
      "       2315.28, 2351.69, 2395.85, 2454.05, 2504.83, 2552.16, 2613.22,\n",
      "       2672.54, 2721.11, 2762.54, 2804.32, 2862.52, 2914.2 , 2972.67]), array([  12.15,   61.49,  161.98,  243.2 ,  283.16,  344.04,  391.82,\n",
      "        433.04,  503.04,  569.81,  627.73,  670.82,  719.96,  772.02,\n",
      "        816.51,  865.33,  912.52,  983.66, 1032.07, 1075.26, 1112.12,\n",
      "       1162.62, 1224.24, 1323.6 , 1384.64, 1436.56, 1493.7 , 1562.  ,\n",
      "       1605.11, 1684.37, 1752.17, 1795.19, 1852.7 , 1914.48, 1972.9 ,\n",
      "       2034.2 , 2083.77, 2133.11, 2186.21, 2245.1 , 2303.09, 2372.62,\n",
      "       2413.92, 2463.21, 2513.09, 2562.67, 2631.64, 2683.96, 2723.09,\n",
      "       2793.23, 2833.55, 2892.43, 2942.56]), array([  12.11,   42.63,  102.78,  171.41,  239.82,  312.2 ,  355.32,\n",
      "        413.17,  472.09,  526.17,  601.55,  643.5 ,  684.57,  744.77,\n",
      "        800.33,  842.93,  891.94,  934.91, 1003.46, 1044.27, 1112.48,\n",
      "       1185.48, 1225.23, 1284.48, 1333.97, 1383.83, 1425.31, 1488.52,\n",
      "       1533.5 , 1583.87, 1628.04, 1671.72, 1716.09, 1780.38, 1823.18,\n",
      "       1872.42, 1911.81, 1962.6 , 2003.89, 2061.56, 2112.14, 2175.21,\n",
      "       2224.66, 2293.42, 2375.1 , 2424.41, 2462.44, 2505.59, 2565.65,\n",
      "       2614.7 , 2682.79, 2732.31, 2775.92, 2824.43, 2883.75, 2944.11,\n",
      "       2986.47])]\n"
     ]
    }
   ],
   "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
}