__author__ = 'Aaron D. Milstein'
from specify_cells import *
from plot_results import *
import sys
import random
"""
Synaptic mechanisms were implemented with a kinetic scheme that allows temporal summation to be tuned to exhibit
facilitation. This script generates plots to demonstrate the normalized summation for single trunk synapses stimulated
5 x 100 Hz.
"""
if len(sys.argv) > 1:
syn_type = str(sys.argv[1])
else:
syn_type = 'NMDA_KIN5'
if len(sys.argv) > 2:
title = str(sys.argv[2])
else:
title = None
if len(sys.argv) > 3:
svg_title = str(sys.argv[3])
else:
svg_title = None
morph_filename = 'EB2-late-bifurcation.swc'
mech_filename = '043016 Type A - km2_NMDA_KIN5_Pr'
def plot_facilitation(syn_type, title=None, svg_title=None):
"""
:param syn_type: str
:param svg_title: str
"""
syn_list = []
syn_list.extend([syn for syn in trunk.synapses if syn_type in syn._syn])
for spine in trunk.spines:
syn_list.extend([syn for syn in spine.synapses if syn_type in syn._syn])
syn = local_random.choice(syn_list)
syn.source.play(spike_times)
sim.append_rec(cell, syn.node, param='_ref_g', object=syn.target(syn_type), description='g_' + syn_type,
ylabel='Conductance', units='uS')
sim.append_rec(cell, syn.node, param='_ref_Ro', object=syn.target(syn_type), description='O_' + syn_type,
ylabel='Occupancy', units=' ')
sim.run(v_init)
syn.source.play(h.Vector([]))
if svg_title is not None:
remember_font_size = mpl.rcParams['font.size']
mpl.rcParams['font.size'] = 20
dt = 0.01
t = np.arange(0., duration, dt)
left = int(equilibrate / dt)
right = int((equilibrate + ISI) / dt)
g = np.interp(t, sim.tvec, sim.rec_list[0]['vec'])
O = np.interp(t, sim.tvec, sim.rec_list[1]['vec'])
unit_gmax = np.max(g[left:right])
g /= unit_gmax
O_max = np.max(O[left:right])
print '%s 1st pulse occupancy: %.4f' % (syn_type, O_max)
t -= equilibrate
start = int((equilibrate - 5.)/dt)
fig, axes = plt.subplots(1)
axes.plot(t[start:], g[start:], color='k')
axes.set_xlabel('Time (ms)')
if title is not None:
axes.set_title(title, fontsize=mpl.rcParams['font.size'])
axes.set_ylabel('Normalized conductance')
axes.set_ylim(-0.1, 1.5)
axes.set_xlim(-5., 140.)
axes.set_xticks([0., 25., 50., 75., 100., 125.])
clean_axes(axes)
axes.tick_params(direction='out')
if not svg_title is None:
fig.set_size_inches(5.27, 4.37)
fig.savefig(data_dir + svg_title + ' - ' + syn_type + ' facilitation.svg', format='svg', transparent=True)
plt.show()
plt.close()
if svg_title is not None:
mpl.rcParams['font.size'] = remember_font_size
equilibrate = 250. # time to steady-state
duration = 450.
v_init = -67.
num_stims = 5
ISI = 10.
spike_times = [equilibrate+i*ISI for i in range(num_stims)]
spike_times = h.Vector(spike_times)
cell = CA1_Pyr(morph_filename, mech_filename, full_spines=True)
cell.zero_na()
sim = QuickSim(duration)
# look for a trunk bifurcation
trunk_bifurcation = [trunk for trunk in cell.trunk if len(trunk.children) > 1 and trunk.children[0].type == 'trunk' and
trunk.children[1].type == 'trunk']
# get where the thickest trunk branch gives rise to the tuft
if trunk_bifurcation: # follow the thicker trunk
trunk = max(trunk_bifurcation[0].children[:2], key=lambda node: node.sec(0.).diam)
trunk = (node for node in cell.trunk if cell.node_in_subtree(trunk, node) and 'tuft' in (child.type for child in
node.children)).next()
else:
trunk = (node for node in cell.trunk if 'tuft' in (child.type for child in node.children)).next()
tuft = (child for child in trunk.children if child.type == 'tuft').next()
trunk = trunk_bifurcation[0]
spine_list = []
if syn_type in ['AMPA_KIN', 'NMDA_KIN5']:
for branch in cell.trunk:
for spine in branch.spines:
syn = Synapse(cell, spine, [syn_type], stochastic=0)
spine_list.extend(trunk.spines)
cell.init_synaptic_mechanisms()
cell.insert_inhibitory_synapses_in_subset(['trunk'])
local_random = random.Random()
local_random.seed(0)
plot_facilitation(syn_type, title, svg_title)
# AMPAR unit occupancy: 0.3258
# NMDAR unit occupancy: 0.5211
# GABAR unit occupancy: 0.4478