{ "cells": [ { "cell_type": "markdown", "id": "6b4fc05a", "metadata": {}, "source": [ "### run_example_simulation.ipynb\n", "\n", "This notebook runs the AL model with two short odor presentation that runs on a personal machine in the span of a minute, highlighting the main functions for circuit execution and visualization." ] }, { "cell_type": "code", "execution_count": 1, "id": "afdf4b5e", "metadata": {}, "outputs": [], "source": [ "import os\n", "import sys\n", "import numpy as np\n", "import pandas as pd\n", "import time\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "id": "25dfc103", "metadata": {}, "outputs": [], "source": [ "project_dir = '../'\n", "sys.path.append(project_dir)\n", "\n", "from utils.data_utils import get_AL_activity_dfs\n", "from utils.simulation_class import Sim\n", "from utils.LIF_funcs_cython import run_LIF_general_sim_wrap as run_LIF, spikes_from_APMask\n", "from utils.data_utils import set_connect_from_scale_dic\n", "from utils.model_params import params as default_params\n", "from utils.make_output_figures import plot_sim_spikes2, plot_AL_activity_dur_pre_odors\n", "from utils.plot_utils import set_font_sizes\n", "set_font_sizes()" ] }, { "cell_type": "markdown", "id": "889320c8", "metadata": {}, "source": [ "Load connectomic information and imputed glomerulus x odor responses:" ] }, { "cell_type": "code", "execution_count": 3, "id": "455d8b14", "metadata": {}, "outputs": [], "source": [ "# default hemibrain data\n", "hemibrain_dir = os.path.join(project_dir, 'connectomics/hemibrain_v1_2')\n", "df_neur_ids = pd.read_csv(os.path.join(hemibrain_dir, 'df_neur_ids.csv'), index_col=0)\n", "al_block = pd.read_csv(os.path.join(hemibrain_dir, 'AL_block.csv'), index_col=0)\n", "imputed_glom_odor_table = pd.read_csv(os.path.join(project_dir, 'odor_imputation/df_odor_door_all_odors_imput_ALS.csv'), index_col=0)" ] }, { "cell_type": "markdown", "id": "4e726b0a", "metadata": {}, "source": [ "Set odor presentation information:" ] }, { "cell_type": "code", "execution_count": 4, "id": "ca6242da", "metadata": {}, "outputs": [], "source": [ "# set ORN decay dynamics to mimic adaptation\n", "decay_tc = 0.11 # seconds to half-height\n", "decay_fadapt = 0.75 # a fraction of max height\n", "\n", "# odors to present\n", "odor_panel = ['3-octanol', '4-methylcyclohexanol']\n", "\n", "# set up time array\n", "n_odors = len(odor_panel)\n", "stim_duration = 0.01\n", "stim_pause = 0.005\n", "trial_duration = stim_duration + stim_pause\n", "end_time = (n_odors*trial_duration) + 0.001" ] }, { "cell_type": "markdown", "id": "5933ab3c", "metadata": {}, "source": [ "Set multipliers onto cell type columns of the connectivity matrix (these particular ones were found by hand tuning to give reasonable AL features):" ] }, { "cell_type": "code", "execution_count": 5, "id": "dcaf8672", "metadata": {}, "outputs": [], "source": [ "col_orn = 1\n", "col_iln = 0.2\n", "col_eln = 0.4\n", "col_pn = 4\n", "\n", "custom_scale_dic = {\n", " 'ALL': 0.1,\n", " 'otoo': col_orn, 'otoi': col_iln, 'otoe': col_eln, 'otop': col_pn,\n", " 'itoo': col_orn, 'itoi': col_iln, 'itoe': col_eln, 'itop': col_pn,\n", " 'etoo': col_orn, 'etoi': col_iln, 'etoe': col_eln, 'etop': col_pn,\n", " 'ptoo': col_orn, 'ptoi': col_iln, 'ptoe': col_eln, 'ptop': col_pn,\n", " }" ] }, { "cell_type": "markdown", "id": "0d6ba86c", "metadata": {}, "source": [ "Initialize an instance of a Sim object that houses all simulation info:" ] }, { "cell_type": "code", "execution_count": 6, "id": "c6e4c147", "metadata": {}, "outputs": [], "source": [ "sim = Sim(params = default_params,\n", " df_neur_ids=df_neur_ids, \n", " al_block=al_block,\n", " model_name = 'example run',\n", " home_dir = project_dir,\n", " end_time = end_time,\n", " )" ] }, { "cell_type": "markdown", "id": "36cd7bac", "metadata": {}, "source": [ "Add the odors into the Sim object:" ] }, { "cell_type": "code", "execution_count": 7, "id": "25a5807c", "metadata": {}, "outputs": [], "source": [ "# set up timings\n", "t_odor_bounds = np.arange(0, end_time+0.01, trial_duration)\n", "start_times = t_odor_bounds[:-1] + stim_pause\n", "end_times = t_odor_bounds[1:]\n", "\n", "# add odors according to their times\n", "for i in range(n_odors):\n", " sim.add_odor(odor_name = odor_panel[i],\n", " odor_start = start_times[i], \n", " odor_end = end_times[i],\n", " tc = decay_tc,\n", " fadapt = decay_fadapt,\n", " imputed_glom_responses=imputed_glom_odor_table)" ] }, { "cell_type": "markdown", "id": "ccd7f313", "metadata": {}, "source": [ "Set the timing of odor-evoked spikes on ORNs:" ] }, { "cell_type": "code", "execution_count": 8, "id": "2ca39622", "metadata": {}, "outputs": [], "source": [ "# set Iin\n", "Iin = sim.make_Iin(is_input_PSC=True)" ] }, { "cell_type": "markdown", "id": "b7bf9e1d", "metadata": {}, "source": [ "Set which LNs to flip to excitatory:" ] }, { "cell_type": "code", "execution_count": 9, "id": "53af8255", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[63 36 54 62 78 85 55 57 44 92 29 40 33 61 39 59 1 56 71 9 79 27 66 72\n", " 96 48 35 74 4 64 10]\n" ] } ], "source": [ "# set excitatory LN positions\n", "np.random.seed(1234)\n", "LN_bodyIds = df_neur_ids[df_neur_ids.altype == 'LN'].bodyId.values\n", "num_LNs = len(LN_bodyIds)\n", "num_eLNs = int(np.round(num_LNs / 6.4))\n", "topk = int(np.round(num_LNs / 2))\n", "nlns = len(LN_bodyIds)\n", "elnpos = np.random.choice(np.arange(topk), num_eLNs, replace=False) \n", "print(elnpos)\n", "\n", "# ### Set synapse strengths \n", "sim.set_eLNs(elnpos)" ] }, { "cell_type": "markdown", "id": "a7273af2", "metadata": {}, "source": [ "Set the connectivity matrix multipliers from above:" ] }, { "cell_type": "code", "execution_count": 10, "id": "1c97654f", "metadata": {}, "outputs": [], "source": [ "# set scalars on class to class strengths\n", "connect = set_connect_from_scale_dic(custom_scale_dic, sim)\n", "sim.set_connect(connect.values) " ] }, { "cell_type": "markdown", "id": "aa8b76a5", "metadata": {}, "source": [ "Run the leaky-integrate and fire simulator, and retrieve arrays of `num_neurons x num_timesteps` for voltages (`V`), currents (`I`), and indicators of when a neuron is undergoing a templated action potential (`APMask`):\n", "\n", "(should run in about a minute)" ] }, { "cell_type": "code", "execution_count": 11, "id": "b5d20ba5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "running LIF...\n", "done running LIF\n", "elapsed 26.17527198791504\n" ] } ], "source": [ "# ### Run simulation\n", "t0 = time.time()\n", "print('running LIF...')\n", "V, I, APMask = run_LIF(sim, Iin)\n", "print('done running LIF')\n", "tf = time.time()\n", "print('elapsed', tf-t0)" ] }, { "cell_type": "markdown", "id": "43bd7820", "metadata": {}, "source": [ "Get spike timings for all neurons via the action potential mask:" ] }, { "cell_type": "code", "execution_count": 12, "id": "274f9b8f", "metadata": {}, "outputs": [], "source": [ "# count spikes\n", "Spikes = spikes_from_APMask(APMask)" ] }, { "cell_type": "code", "execution_count": 13, "id": "a5a955c2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.]])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Spikes" ] }, { "cell_type": "markdown", "id": "3c5f7c37", "metadata": {}, "source": [ "For each odor, for each neuron, record firing rates in the time before the odor presentation, and during:" ] }, { "cell_type": "code", "execution_count": 14, "id": "6ca8d63b", "metadata": {}, "outputs": [], "source": [ "df_AL_activity, df_AL_activity_long = get_AL_activity_dfs(sim, Spikes)" ] }, { "cell_type": "code", "execution_count": 15, "id": "5883fda7", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", " | neur_name | \n", "neur_type | \n", "fr_pre_odor0 | \n", "fr_dur_odor0 | \n", "fr_pre_odor1 | \n", "fr_dur_odor1 | \n", "glom | \n", "
---|---|---|---|---|---|---|---|
0 | \n", "ORN_DA1_0 | \n", "ORN | \n", "0.0 | \n", "100.0 | \n", "0.0 | \n", "100.0 | \n", "DA1 | \n", "
1 | \n", "ORN_DA1_1 | \n", "ORN | \n", "0.0 | \n", "0.0 | \n", "0.0 | \n", "0.0 | \n", "DA1 | \n", "
2 | \n", "ORN_DA1_2 | \n", "ORN | \n", "0.0 | \n", "0.0 | \n", "0.0 | \n", "100.0 | \n", "DA1 | \n", "
3 | \n", "ORN_DA1_3 | \n", "ORN | \n", "0.0 | \n", "0.0 | \n", "0.0 | \n", "0.0 | \n", "DA1 | \n", "
4 | \n", "ORN_DA1_4 | \n", "ORN | \n", "0.0 | \n", "0.0 | \n", "0.0 | \n", "100.0 | \n", "DA1 | \n", "