CA1 pyr cell: Inhibitory modulation of spatial selectivity+phase precession (Grienberger et al 2017)

 Download zip file 
Help downloading and running models
Accession:225080
Spatially uniform synaptic inhibition enhances spatial selectivity and temporal coding in CA1 place cells by suppressing broad out-of-field excitation.
Reference:
1 . Grienberger C, Milstein AD, Bittner KC, Romani S, Magee JC (2017) Inhibitory suppression of heterogeneously tuned excitation enhances spatial coding in CA1 place cells. Nat Neurosci [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell; Realistic Network;
Brain Region(s)/Organism: Hippocampus;
Cell Type(s): Hippocampus CA1 pyramidal cell;
Channel(s):
Gap Junctions:
Receptor(s): NMDA;
Gene(s):
Transmitter(s):
Simulation Environment: NEURON; Python;
Model Concept(s): Active Dendrites; Detailed Neuronal Models; Place cell/field; Synaptic Integration; Short-term Synaptic Plasticity; Spatial Navigation; Feature selectivity;
Implementer(s): Milstein, Aaron D. [aaronmil at stanford.edu];
Search NeuronDB for information about:  Hippocampus CA1 pyramidal cell; NMDA;
/
GrienbergerEtAl2017
morphologies
readme.txt
ampa_kin.mod *
exp2EPSC.mod
exp2EPSG.mod
exp2EPSG_NMDA.mod
gaba_a_kin.mod *
h.mod
kad.mod *
kap.mod *
kdr.mod *
km2.mod
nas.mod
nax.mod
nmda_kin2.mod
nmda_kin3.mod
nmda_kin5.mod *
pr.mod *
vecevent.mod *
batch_EPSP_attenuation.sh
batch_place_cell_r_inp.sh
batch_place_cell_record_i_syn.sh
batch_place_cell_single_compartment.sh
batch_place_cell_subtr_inh.sh
batch_place_cell_subtr_inh_shifted.sh
batch_place_cell_subtr_inh_vclamp.sh
batch_process_i_syn_files.sh
batch_rinp.sh
batch_spine_attenuation_ratio.sh
build_expected_EPSP_reference.sh
build_expected_EPSP_reference_controller.py
build_expected_EPSP_reference_engine.py
consolidate_i_syn_files.py
consolidate_tracked_spine_data.py
fit_parameter_exponential_distribution.py
function_lib.py
optimize_AMPA_KIN.py
optimize_dendritic_excitability_020416.py
optimize_GABA_A_KIN.py
optimize_NMDA_KIN2.py
parallel_branch_cooperativity.sh
parallel_branch_cooperativity_no_nmda.sh
parallel_clustered_branch_cooperativity_nmda_controller_110315.py
parallel_clustered_branch_cooperativity_nmda_engine_110315.py
parallel_EPSP_attenuation_controller.py
parallel_EPSP_attenuation_engine.py
parallel_EPSP_i_attenuation_controller.py
parallel_EPSP_i_attenuation_engine.py
parallel_expected_EPSP_controller.py
parallel_expected_EPSP_engine.py
parallel_optimize_branch_cooperativity.sh
parallel_optimize_branch_cooperativity_nmda_kin3_controller.py
parallel_optimize_branch_cooperativity_nmda_kin3_engine.py
parallel_optimize_EPSP_amp_controller.py
parallel_optimize_EPSP_amp_engine.py
parallel_optimize_pr.sh
parallel_optimize_pr_controller_020116.py
parallel_optimize_pr_engine_020116.py
parallel_rinp_controller.py
parallel_rinp_engine.py
parallel_spine_attenuation_ratio_controller.py
parallel_spine_attenuation_ratio_engine.py
plot_channel_distributions.py
plot_NMDAR_kinetics.py
plot_results.py
plot_spine_traces.py
plot_synaptic_conductance_facilitation.py
process_i_syn_files.py
record_bAP_attenuation.py
simulate_place_cell_no_precession.py
simulate_place_cell_single_compartment.py
simulate_place_cell_single_compartment_no_nmda.py
simulate_place_cell_subtr_inh.py
simulate_place_cell_subtr_inh_add_noise.py
simulate_place_cell_subtr_inh_add_noise_no_na.py
simulate_place_cell_subtr_inh_no_na.py
simulate_place_cell_subtr_inh_no_nmda_no_na.py
simulate_place_cell_subtr_inh_r_inp.py
simulate_place_cell_subtr_inh_rec_i_syn.py
simulate_place_cell_subtr_inh_shifted.py
simulate_place_cell_subtr_inh_silent.py
simulate_place_cell_subtr_inh_vclamp.py
specify_cells.py
                            
__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