|
24 | 24 | "metadata": {}, |
25 | 25 | "outputs": [], |
26 | 26 | "source": [ |
27 | | - "PLOT_ONLY_FROM_EQUILIBRIUM=True\n", |
28 | | - "BIN_SIZE_FIRING_RATE = 10\n", |
| 27 | + "PLOT_ONLY_FROM_EQUILIBRIUM=True # Plot graphs only from equilibrium time\n", |
| 28 | + "BIN_SIZE_FIRING_RATE = 10 # Number of bins for firing rates historgram\n", |
29 | 29 | "USE_SYNAPSE_PROBS = True\n", |
| 30 | + "USE_DENDRITE_MODEL = False\n", |
30 | 31 | "\n", |
31 | 32 | "\n", |
32 | 33 | "index_to_ntype_dict = {\n", |
|
36 | 37 | " 3: 'PV'\n", |
37 | 38 | "}\n", |
38 | 39 | "\n", |
39 | | - "equilibrium_t = 0.2*second\n", |
40 | | - "no_simulations = 20" |
| 40 | + "equilibrium_t = 0.2*second # Default equilibirium time. Should be set based on previous simulation results\n", |
| 41 | + "no_simulations = 20 # Number of simulations to be conducted & their results are averaged" |
41 | 42 | ] |
42 | 43 | }, |
43 | 44 | { |
|
50 | 51 | "################################################################################\n", |
51 | 52 | "# Model parameters\n", |
52 | 53 | "################################################################################\n", |
| 54 | + "\n", |
53 | 55 | "### General parameters\n", |
54 | 56 | "duration = 3*second # Total simulation time\n", |
55 | | - "sim_dt = 0.1*ms # Integrator/sampling step\n", |
| 57 | + "sim_dt = 0.1*ms # Integrator/sampling step\n", |
56 | 58 | "\n", |
57 | | - "N_sst = 34 # Number of SST neurons (inhibitory)\n", |
58 | | - "N_pv = 46 # Number of PV neurons (inhibitory)\n", |
59 | | - "N_cc = 275 # Number of CC neurons (excitatory)\n", |
60 | | - "N_cs = 45 # Number of CS neurons (excitatory)\n", |
| 59 | + "N_sst = 34 # Number of SST neurons (inhibitory)\n", |
| 60 | + "N_pv = 46 # Number of PV neurons (inhibitory)\n", |
| 61 | + "N_cc = 275 # Number of CC (PYR) neurons (excitatory)\n", |
| 62 | + "N_cs = 45 # Number of CS (PYR) neurons (excitatory)\n", |
61 | 63 | "N = [N_cs, N_cc, N_sst, N_pv]\n", |
62 | 64 | "\n", |
63 | 65 | "### Neuron parameters\n", |
64 | | - "tau_S = 16*ms # \n", |
65 | | - "tau_D = 7*ms #\n", |
66 | | - "tau_SST = 20*ms #\n", |
67 | | - "tau_PV = 10*ms #\n", |
| 66 | + "tau_S = 16*ms # PYR neuron - soma membrane time constant \n", |
| 67 | + "tau_D = 7*ms # PYR neuron - dendritic membrane time constant\n", |
| 68 | + "tau_SST = 20*ms # SST neuron membrane time constant\n", |
| 69 | + "tau_PV = 10*ms # PV neuron membrane time constant\n", |
68 | 70 | "tau_E = 5*ms # Excitatory synaptic time constant\n", |
69 | 71 | "tau_I = 10*ms # Inhibitory synaptic time constant\n", |
70 | 72 | "\n", |
71 | | - "C_S = 370*pF\n", |
72 | | - "C_D = 170*pF\n", |
73 | | - "C_SST = 100*pF\n", |
74 | | - "C_PV = 100*pF\n", |
| 73 | + "C_S = 370*pF # PYR neuron - soma membrane capacitance\n", |
| 74 | + "C_D = 170*pF # PYR neuron - dendritic membrane capacitance\n", |
| 75 | + "C_SST = 100*pF # SST neuron membrane capacitance\n", |
| 76 | + "C_PV = 100*pF # PV neuron membrane capacitance\n", |
75 | 77 | "\n", |
76 | 78 | "E_l = -70*mV # leak reversal potential\n", |
77 | 79 | "E_e = 0*mV # Excitatory synaptic reversal potential\n", |
|
87 | 89 | "### Connectivity weight & probabilities\n", |
88 | 90 | "# CS_CS 0, CS_SST 1, CS_PV 2, SST_CS 3, PV_CS 4, CC_CC 5, CC_SST 6, CC_PV 7, SST_CC 8, PV_CC 9, CC_CS 10, SST_PV 11, SST_SST 12, PV_PV 13, PV_SST 14, \n", |
89 | 91 | "conn_weights = [0.27, 0.05, 1.01, 0.19, 0.32, 0.24, 0.09, 0.48, 0.19, 0.52, 0.19, 0.18, 0.19, 0.47, 0.44] # in nS\n", |
90 | | - "# If not `USE_SYNAPSE_PROBS`, the topology is maintained as specified with a probability p=1\n", |
91 | 92 | "if USE_SYNAPSE_PROBS: \n", |
92 | 93 | " # CS_CS 0, CS_SST 1, CS_PV 2, SST_CS 3, PV_CS 4, CC_CC 5, CC_SST 6, CC_PV 7, SST_CC 8, PV_CC 9, CC_CS 10, SST_PV 11, SST_SST 12, PV_PV 13, PV_SST 14, \n", |
93 | 94 | " conn_probs = [0.16, 0.23, 0.18, 0.52, 0.43, 0.06, 0.26, 0.22, 0.13, 0.38, 0.09, 0.29, 0.1, 0.5, 0.14]\n", |
| 95 | + "# If not `USE_SYNAPSE_PROBS`, the topology is maintained as specified with a probability p=1\n", |
94 | 96 | "else: \n", |
95 | 97 | " conn_probs = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n", |
96 | 98 | "\n", |
97 | | - "### External Input\n", |
| 99 | + "### External input amplitude & steady state\n", |
98 | 100 | "I_sst_amp = 50\n", |
99 | 101 | "I_pv_amp = 50\n", |
100 | 102 | "I_cc_amp = 200\n", |
101 | 103 | "I_cs_amp = 100\n", |
102 | 104 | "\n", |
103 | | - "I_sst_steady = 0\n", |
104 | | - "I_pv_steady = 0\n", |
105 | | - "I_cc_steady = 0\n", |
106 | | - "I_cs_steady = 0\n", |
107 | | - "\n", |
108 | | - "\n", |
109 | | - "lambda_cs = lambda_cc = lambda_sst = lambda_pv = 10*Hz\n", |
| 105 | + "I_sst_steady = I_pv_steady = I_cc_steady = I_cs_steady = 0\n", |
| 106 | + "ambda_sst = lambda_pv = lambda_cc = lambda_cs = 10*Hz\n", |
110 | 107 | "\n", |
111 | 108 | "input_steady = [I_cs_steady, I_cc_steady, I_sst_steady, I_pv_steady]\n", |
112 | 109 | "input_amplitudes = [I_cs_amp, I_cc_amp, I_sst_amp, I_pv_amp]\n", |
|
120 | 117 | "spatial_phase = 1\n", |
121 | 118 | "tsteps = int(duration / sim_dt)\n", |
122 | 119 | "\n", |
| 120 | + "### Simulation weights for CC->CS connection probabilities\n", |
123 | 121 | "cc_cs_weights = [0, 0.125, 0.25, 0.5, 1, 2, 4, 8]\n", |
| 122 | + "\n", |
| 123 | + "### Degrees for simulated orientation input\n", |
124 | 124 | "degrees = [0, 90, 180, 270]\n", |
125 | 125 | "\n", |
126 | 126 | "################################################################################" |
|
150 | 150 | "metadata": {}, |
151 | 151 | "outputs": [], |
152 | 152 | "source": [ |
| 153 | + "# Equations for SST (inhibitory) neurons\n", |
153 | 154 | "eqs_sst_inh = '''\n", |
154 | 155 | " dv/dt = ((E_l-v)/tau_SST + I/C_SST) : volt (unless refractory)\n", |
155 | 156 | "\n", |
|
159 | 160 | " I = g_e*(E_e - v) + g_i*(E_i - v) : amp\n", |
160 | 161 | "'''\n", |
161 | 162 | "\n", |
| 163 | + "# Equations for PV (inhibitory) neurons\n", |
162 | 164 | "eqs_pv_inh = '''\n", |
163 | 165 | " dv/dt = ((E_l-v)/tau_PV + I/C_PV) : volt (unless refractory)\n", |
164 | 166 | "\n", |
|
168 | 170 | " I = g_e*(E_e - v) + g_i*(E_i - v) : amp\n", |
169 | 171 | "'''\n", |
170 | 172 | "\n", |
171 | | - "eqs_exc = '''\n", |
| 173 | + "# Equations for PYR (excitatory) neurons WITH dendrites\n", |
| 174 | + "eqs_exc_with_dendrite = '''\n", |
172 | 175 | " dv_s/dt = ((E_l-v_s)/tau_S + (g_s*(1/(1+exp(-(v_d-E_d)/D_d))) + I_s)/C_S) : volt (unless refractory)\n", |
173 | 176 | "\n", |
174 | 177 | " dg_es/dt = -g_es/tau_E : siemens\n", |
|
183 | 186 | "\n", |
184 | 187 | " I_d = g_ed*(E_e - v_d) + g_id*(E_i - v_d) : amp\n", |
185 | 188 | " K : 1\n", |
| 189 | + "'''\n", |
| 190 | + "\n", |
| 191 | + "# Equations for PYR (excitatory) neurons WITHOUT dendrites\n", |
| 192 | + "eqs_exc_without_dendrite = '''\n", |
| 193 | + " dv_s/dt = ((E_l-v_s)/tau_S + I_s/C_S) : volt (unless refractory)\n", |
| 194 | + "\n", |
| 195 | + " dg_es/dt = -g_es/tau_E : siemens\n", |
| 196 | + " dg_is/dt = -g_is/tau_I : siemens\n", |
| 197 | + "\n", |
| 198 | + " I_s = g_es*(E_e - v_s) + g_is*(E_i - v_s) : amp\n", |
| 199 | + " K : 1\n", |
186 | 200 | "'''" |
187 | 201 | ] |
188 | 202 | }, |
|
263 | 277 | " pv_input_i = PoissonInput(pv_neurons, 'g_e', N=1, rate=lambda_pv, weight=f'I_ext_pv(t, {n_idx})')\n", |
264 | 278 | "\n", |
265 | 279 | " # CS Neurons\n", |
266 | | - " cs_neurons = NeuronGroup(N_cs, model=eqs_exc, threshold='v_s > V_t',\n", |
267 | | - " reset='v_s = E_l', refractory=8.3 * ms, method='euler')\n", |
268 | | - " cs_neurons.v_s = 'E_l + rand()*(V_t-E_l)'\n", |
269 | | - " cs_neurons.v_d = -70 * mV\n", |
| 280 | + " if USE_DENDRITE_MODEL:\n", |
| 281 | + " cs_neurons = NeuronGroup(N_cs, model=eqs_exc_with_dendrite, threshold='v_s > V_t',\n", |
| 282 | + " reset='v_s = E_l', refractory=8.3 * ms, method='euler')\n", |
| 283 | + " cs_neurons.v_s = 'E_l + rand()*(V_t-E_l)'\n", |
| 284 | + " cs_neurons.v_d = -70 * mV\n", |
| 285 | + " else:\n", |
| 286 | + " cs_neurons = NeuronGroup(N_cs, model=eqs_exc_without_dendrite, threshold='v_s > V_t',\n", |
| 287 | + " reset='v_s = E_l', refractory=8.3 * ms, method='euler')\n", |
| 288 | + " cs_neurons.v_s = 'E_l + rand()*(V_t-E_l)'\n", |
270 | 289 | "\n", |
271 | 290 | " ## Poisson input to CS neurons\n", |
272 | 291 | " for n_idx in range(N_cs):\n", |
273 | 292 | " cs_input_i = PoissonInput(cs_neurons, 'g_es', N=1, rate=lambda_cs, weight=f'I_ext_cs(t, {n_idx})')\n", |
274 | 293 | "\n", |
275 | 294 | " # CC Neurons\n", |
276 | | - " cc_neurons = NeuronGroup(N_cc, model=eqs_exc, threshold='v_s > V_t',\n", |
277 | | - " reset='v_s = E_l', refractory=8.3 * ms, method='euler')\n", |
278 | | - " cc_neurons.v_s = 'E_l + rand()*(V_t-E_l)'\n", |
279 | | - " cc_neurons.v_d = -70 * mV\n", |
| 295 | + " if USE_DENDRITE_MODEL:\n", |
| 296 | + " cc_neurons = NeuronGroup(N_cc, model=eqs_exc_with_dendrite, threshold='v_s > V_t',\n", |
| 297 | + " reset='v_s = E_l', refractory=8.3 * ms, method='euler')\n", |
| 298 | + " cc_neurons.v_s = 'E_l + rand()*(V_t-E_l)'\n", |
| 299 | + " cc_neurons.v_d = -70 * mV\n", |
| 300 | + " else:\n", |
| 301 | + " cc_neurons = NeuronGroup(N_cc, model=eqs_exc_without_dendrite, threshold='v_s > V_t',\n", |
| 302 | + " reset='v_s = E_l', refractory=8.3 * ms, method='euler')\n", |
| 303 | + " cc_neurons.v_s = 'E_l + rand()*(V_t-E_l)'\n", |
280 | 304 | "\n", |
281 | 305 | " ## Poisson input to CC neurons\n", |
282 | 306 | " for n_idx in range(N_cc):\n", |
|
322 | 346 | " conn_CCsoma_PV.w = conn_weights[CCsoma_PV]\n", |
323 | 347 | " \n", |
324 | 348 | " # SST => PYR dendrite\n", |
325 | | - " ## target CS dendrite\n", |
326 | | - " SST_CSdendrite = 3\n", |
327 | | - " conn_SST_CSdendrite = Synapses(sst_neurons, cs_neurons, model='w: 1', on_pre='g_id+=w*nS', name='SST_CSdendrite') # inhibitory\n", |
328 | | - " conn_SST_CSdendrite_prob = conn_probs[SST_CSdendrite] * sst_dendrite_conn_weight\n", |
329 | | - " conn_SST_CSdendrite.connect(p=conn_SST_CSdendrite_prob) # prob divided between soma & dendrite\n", |
330 | | - " conn_SST_CSdendrite.w = conn_weights[SST_CSdendrite]\n", |
331 | | - "\n", |
332 | | - " ## target CC dendrite\n", |
333 | | - " SST_CCdendrite = 8\n", |
334 | | - " conn_SST_CCdendrite = Synapses(sst_neurons, cc_neurons, model='w: 1', on_pre='g_id+=w*nS', name='SST_CCdendrite') # inhibitory\n", |
335 | | - " conn_SST_CCdendrite_prob = conn_probs[SST_CCdendrite] * sst_dendrite_conn_weight\n", |
336 | | - " conn_SST_CCdendrite.connect(p=conn_SST_CCdendrite_prob) # prob divided between soma & dendrite\n", |
337 | | - " conn_SST_CCdendrite.w = conn_weights[SST_CCdendrite]\n", |
| 349 | + " if USE_DENDRITE_MODEL:\n", |
| 350 | + " ## target CS dendrite\n", |
| 351 | + " SST_CSdendrite = 3\n", |
| 352 | + " conn_SST_CSdendrite = Synapses(sst_neurons, cs_neurons, model='w: 1', on_pre='g_id+=w*nS', name='SST_CSdendrite') # inhibitory\n", |
| 353 | + " conn_SST_CSdendrite_prob = conn_probs[SST_CSdendrite] * sst_dendrite_conn_weight # prob divided between soma & dendrite\n", |
| 354 | + " conn_SST_CSdendrite.connect(p=conn_SST_CSdendrite_prob) \n", |
| 355 | + " conn_SST_CSdendrite.w = conn_weights[SST_CSdendrite]\n", |
| 356 | + "\n", |
| 357 | + " ## target CC dendrite\n", |
| 358 | + " SST_CCdendrite = 8\n", |
| 359 | + " conn_SST_CCdendrite = Synapses(sst_neurons, cc_neurons, model='w: 1', on_pre='g_id+=w*nS', name='SST_CCdendrite') # inhibitory\n", |
| 360 | + " conn_SST_CCdendrite_prob = conn_probs[SST_CCdendrite] * sst_dendrite_conn_weight # prob divided between soma & dendrite\n", |
| 361 | + " conn_SST_CCdendrite.connect(p=conn_SST_CCdendrite_prob) \n", |
| 362 | + " conn_SST_CCdendrite.w = conn_weights[SST_CCdendrite]\n", |
338 | 363 | "\n", |
339 | 364 | " # SST <=> PYR soma\n", |
340 | 365 | " ## target CS soma\n", |
341 | 366 | " SST_CSsoma = 3\n", |
342 | 367 | " conn_SST_CSsoma = Synapses(sst_neurons, cs_neurons, model='w: 1', on_pre='g_is+=w*nS', name='SST_CSsoma') # inhibitory (optional connection)\n", |
343 | | - " conn_SST_CSsoma_prob = conn_probs[SST_CSsoma] * sst_soma_conn_weight\n", |
344 | | - " conn_SST_CSsoma.connect(p=conn_SST_CSsoma_prob) # prob divided between soma & dendrite\n", |
| 368 | + " conn_SST_CSsoma_prob = conn_probs[SST_CSsoma] * sst_soma_conn_weight if USE_DENDRITE_MODEL else conn_probs[SST_CSsoma] # prob divided between soma & dendrite only if `USE_DENDRITE_MODEL` \n", |
| 369 | + " conn_SST_CSsoma.connect(p=conn_SST_CSsoma_prob) \n", |
345 | 370 | " conn_SST_CSsoma.w = conn_weights[SST_CSsoma]\n", |
346 | 371 | "\n", |
347 | 372 | " CSsoma_SST = 1\n", |
|
352 | 377 | " ## taget CC soma\n", |
353 | 378 | " SST_CCsoma = 8\n", |
354 | 379 | " conn_SST_CCsoma = Synapses(sst_neurons, cc_neurons, model='w: 1', on_pre='g_is+=w*nS', name='SST_CCsoma') # inhibitory (optional connection)\n", |
355 | | - " conn_SST_CCsoma_prob = conn_probs[SST_CCsoma] * sst_soma_conn_weight\n", |
356 | | - " conn_SST_CCsoma.connect(p=conn_SST_CCsoma_prob) # prob divided between soma & dendrite\n", |
| 380 | + " conn_SST_CCsoma_prob = conn_probs[SST_CCsoma] * sst_soma_conn_weight if USE_DENDRITE_MODEL else conn_probs[SST_CCsoma] # prob divided between soma & dendrite only if `USE_DENDRITE_MODEL` \n", |
| 381 | + " conn_SST_CCsoma.connect(p=conn_SST_CCsoma_prob)\n", |
357 | 382 | " conn_SST_CCsoma.w = conn_weights[SST_CCsoma]\n", |
358 | 383 | "\n", |
359 | 384 | " CCsoma_SST = 6\n", |
|
0 commit comments