{ "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*3 * nS, LOW: 0.25 * nS, OFF: 0 * nS}\n", " INHIBITORY_NOISE_VARIANCE = {HIGH: 1.25*3 * 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.58173 s (4%) simulated in 10s, estimated 3m 16s remaining.\n", "1.13996 s (9%) simulated in 20s, estimated 3m 11s remaining.\n", "1.54917 s (12%) simulated in 30s, estimated 3m 22s remaining.\n", "2.07577 s (17%) simulated in 40s, estimated 3m 11s remaining.\n", "2.5832 s (21%) simulated in 50s, estimated 3m 2s remaining.\n", "3.10437 s (25%) simulated in 1m 0s, estimated 2m 52s remaining.\n", "3.63631 s (30%) simulated in 1m 10s, estimated 2m 41s remaining.\n", "4.14982 s (34%) simulated in 1m 20s, estimated 2m 31s remaining.\n", "4.68311 s (39%) simulated in 1m 30s, estimated 2m 21s remaining.\n", "5.21221 s (43%) simulated in 1m 40s, estimated 2m 10s remaining.\n", "5.74059 s (47%) simulated in 1m 50s, estimated 2m 0s remaining.\n", "6.27133 s (52%) simulated in 2m 0s, estimated 1m 50s remaining.\n", "6.805 s (56%) simulated in 2m 10s, estimated 1m 39s remaining.\n", "7.33379 s (61%) simulated in 2m 20s, estimated 1m 29s remaining.\n", "7.86681 s (65%) simulated in 2m 30s, estimated 1m 19s remaining.\n", "8.39995 s (69%) simulated in 2m 40s, estimated 1m 9s remaining.\n", "8.93424 s (74%) simulated in 2m 50s, estimated 58s remaining.\n", "9.46094 s (78%) simulated in 3m 0s, estimated 48s remaining.\n", "9.99535 s (83%) simulated in 3m 10s, estimated 38s remaining.\n", "10.52133 s (87%) simulated in 3m 20s, estimated 28s remaining.\n", "11.0401 s (92%) simulated in 3m 30s, estimated 18s remaining.\n", "11.56781 s (96%) simulated in 3m 40s, estimated 8s remaining.\n", "12. s (100%) simulated in 3m 48s\n" ] }, { "data": { "text/plain": [ "[<matplotlib.collections.EventCollection at 0x24c15b72a90>,\n", " <matplotlib.collections.EventCollection at 0x24c15b8f520>,\n", " <matplotlib.collections.EventCollection at 0x24c15b9df10>,\n", " <matplotlib.collections.EventCollection at 0x24c15bb1a00>,\n", " <matplotlib.collections.EventCollection at 0x24c15bc43d0>,\n", " <matplotlib.collections.EventCollection at 0x24c15bd1dc0>,\n", " <matplotlib.collections.EventCollection at 0x24c15be4730>,\n", " <matplotlib.collections.EventCollection at 0x24c15bf1ee0>,\n", " <matplotlib.collections.EventCollection at 0x24c15c049a0>,\n", " <matplotlib.collections.EventCollection at 0x24c15c172e0>,\n", " <matplotlib.collections.EventCollection at 0x24c15c25e20>,\n", " <matplotlib.collections.EventCollection at 0x24c15c36790>,\n", " <matplotlib.collections.EventCollection at 0x24c15c4b340>,\n", " <matplotlib.collections.EventCollection at 0x24c15c59e20>,\n", " <matplotlib.collections.EventCollection at 0x24c15c6b7c0>,\n", " <matplotlib.collections.EventCollection at 0x24c15c7d100>,\n", " <matplotlib.collections.EventCollection at 0x24c15c8d940>,\n", " <matplotlib.collections.EventCollection at 0x24c15c9e3d0>,\n", " <matplotlib.collections.EventCollection at 0x24c15cabd60>,\n", " <matplotlib.collections.EventCollection at 0x24c15cbd670>,\n", " <matplotlib.collections.EventCollection at 0x24c15cd3130>,\n", " <matplotlib.collections.EventCollection at 0x24c15cdfb20>,\n", " <matplotlib.collections.EventCollection at 0x24c15cf2460>,\n", " <matplotlib.collections.EventCollection at 0x24c15d00f10>,\n", " <matplotlib.collections.EventCollection at 0x24c15d128b0>,\n", " <matplotlib.collections.EventCollection at 0x24c15d262b0>,\n", " <matplotlib.collections.EventCollection at 0x24c15d34bb0>,\n", " <matplotlib.collections.EventCollection at 0x24c15d45670>,\n", " <matplotlib.collections.EventCollection at 0x24c15d590d0>,\n", " <matplotlib.collections.EventCollection at 0x24c15d66b20>,\n", " <matplotlib.collections.EventCollection at 0x24c15d7a640>,\n", " <matplotlib.collections.EventCollection at 0x24c15d86e50>,\n", " <matplotlib.collections.EventCollection at 0x24c15d9a7c0>,\n", " <matplotlib.collections.EventCollection at 0x24c15dad400>,\n", " <matplotlib.collections.EventCollection at 0x24c15dbaca0>,\n", " <matplotlib.collections.EventCollection at 0x24c15dcc4c0>,\n", " <matplotlib.collections.EventCollection at 0x24c15de0160>,\n", " <matplotlib.collections.EventCollection at 0x24c15deeb20>,\n", " <matplotlib.collections.EventCollection at 0x24c15dff640>,\n", " <matplotlib.collections.EventCollection at 0x24c15e0ee20>,\n", " <matplotlib.collections.EventCollection at 0x24c15e21730>,\n", " <matplotlib.collections.EventCollection at 0x24c15e341f0>,\n", " <matplotlib.collections.EventCollection at 0x24c15e42c70>,\n", " <matplotlib.collections.EventCollection at 0x24c15e54520>,\n", " <matplotlib.collections.EventCollection at 0x24c15e62ee0>,\n", " <matplotlib.collections.EventCollection at 0x24c15e75910>,\n", " <matplotlib.collections.EventCollection at 0x24c15e87220>,\n", " <matplotlib.collections.EventCollection at 0x24c15e95bb0>,\n", " <matplotlib.collections.EventCollection at 0x24c15ea9580>,\n", " <matplotlib.collections.EventCollection at 0x24c15eb6e80>]" ] }, "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.HIGH, 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 = 400 * 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 }