CA1 pyramidal neuron: Persistent Na current mediates steep synaptic amplification (Hsu et al 2018)

 Download zip file 
Help downloading and running models
Accession:240960
This paper shows that persistent sodium current critically contributes to the subthreshold nonlinear dynamics of CA1 pyramidal neurons and promotes rapidly reversible conversion between place-cell and silent-cell in the hippocampus. A simple model built with realistic axo-somatic voltage-gated sodium channels in CA1 (Carter et al., 2012; Neuron 75, 1081–1093) demonstrates that the biophysics of persistent sodium current is sufficient to explain the synaptic amplification effects. A full model built previously (Grienberger et al., 2017; Nature Neuroscience, 20(3): 417–426) with detailed morphology, ion channel types and biophysical properties of CA1 place cells naturally reproduces the steep voltage dependence of synaptic responses.
Reference:
1 . Hsu CL, Zhao X, Milstein AD, Spruston N (2018) Persistent sodium current mediates the steep voltage dependence of spatial coding in hippocampal pyramidal neurons Neuron 99:1-16
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Synapse; Channel/Receptor; Neuron or other electrically excitable cell; Axon; Dendrite;
Brain Region(s)/Organism: Hippocampus;
Cell Type(s): Hippocampus CA1 pyramidal cell; Abstract single compartment conductance based cell;
Channel(s): I Sodium; I A; I M; I h; I K;
Gap Junctions:
Receptor(s): AMPA; NMDA;
Gene(s):
Transmitter(s): Glutamate;
Simulation Environment: NEURON;
Model Concept(s): Ion Channel Kinetics; Membrane Properties; Synaptic Integration; Synaptic Amplification; Place cell/field; Active Dendrites; Conductance distributions; Detailed Neuronal Models; Electrotonus; Markov-type model;
Implementer(s): Hsu, Ching-Lung [hsuc at janelia.hhmi.org]; Milstein, Aaron D. [aaronmil at stanford.edu];
Search NeuronDB for information about:  Hippocampus CA1 pyramidal cell; AMPA; NMDA; I A; I K; I M; I h; I Sodium; Glutamate;
/
HsuEtAl2018
FullModel
data
morphologies
README.md
ampa_kin.mod *
exp2EPSC.mod
gaba_a_kin.mod *
h.mod
kad.mod *
kap.mod *
kdr.mod *
km2.mod
nas.mod
nax.mod
nmda_kin5.mod *
pr.mod *
vecevent.mod *
batch_nap_EPSC_amplification.sh
batch_nap_EPSP_amplification.sh
batch_nap_EPSP_amplification_IO.sh
function_lib.py
install notes.txt
plot_nap_EPSC_amplification.py
plot_nap_EPSP_amplification.py
plot_nap_EPSP_amplification_IO.py
plot_results.py
simulate_nap_EPSC_amplification.py
simulate_nap_EPSP_amplification.py
simulate_nap_EPSP_amplification_IO.py
specify_cells.py
visualize_ion_channel_gating_parameters.py
                            
from plot_results import *


if len(sys.argv) > 1:
    output_file_path = str(sys.argv[1])
    if not os.path.isfile(output_file_path):
        raise IOError('file containing data for nap_EPSP_amplification_IO not found at provided path: %s' %
                      output_file_path)
else:
    output_file_path = 'data/08112017_nap_amplification_IO_DC_soma_stim_trunk.hdf5'
    if not os.path.isfile(output_file_path):
        raise IOError('default file containing data for nap_EPSP_amplification_IO not found: %s' %
                      output_file_path)

mpl.rcParams['font.size'] = 14.

rec_dict = {}
baseline = 10.  # ms
v_th = -52.

with h5py.File(output_file_path, 'r') as f:
    trial = f.itervalues().next()
    if 'dt' in trial.attrs:
        dt = trial.attrs['dt']
    else:
        dt = 0.02
    if 'duration' in trial.attrs:
        duration = trial.attrs['duration']
    else:
        duration = 450.
    if 'equilibrate' in trial.attrs:
        equilibrate = trial.attrs['equilibrate']
    else:
        equilibrate = 250.
    t = np.arange(0., duration, dt)
    start = int((equilibrate - baseline) / dt)
    # end = start + int(100. / dt)
    end = int((duration - 100.)/ dt)
    offset_t = t[start:end] - equilibrate
    for trial in f.itervalues():
        vrest = round(trial.attrs['vrest'])
        if vrest not in rec_dict:
            rec_dict[vrest] = {}
        ttx = trial.attrs['ttx']
        group = 'ttx%i' % int(ttx)
        if group not in rec_dict[vrest]:
            rec_dict[vrest][group] = {}
            rec_dict[vrest][group]['num_syns'] = [0]
            rec_dict[vrest][group]['peak_vm'] = [trial.attrs['vrest']]
            rec_dict[vrest][group]['peak_g_AMPA'] = [0.]
        rec_dict[vrest][group]['num_syns'].append(trial.attrs['num_syns'])
        rec_dict[vrest][group]['peak_g_AMPA'].append(None)
        for rec in trial['rec'].itervalues():
            description = rec.attrs['description']
            this_rec = np.interp(t, trial['time'], rec)[start:end]
            if description == 'soma':
                rec_dict[vrest][group]['peak_vm'].append(min(v_th, np.max(this_rec)))
            elif 'g_AMPA' in description:
                if rec_dict[vrest][group]['peak_g_AMPA'][-1] is None:
                    rec_dict[vrest][group]['peak_g_AMPA'][-1] = this_rec
                else:
                    rec_dict[vrest][group]['peak_g_AMPA'][-1] = np.add(rec_dict[vrest][group]['peak_g_AMPA'][-1],
                                                                       this_rec)
        for i, g_AMPA in enumerate(rec_dict[vrest][group]['peak_g_AMPA']):
            rec_dict[vrest][group]['peak_g_AMPA'][i] = np.max(g_AMPA)

fig, axes = plt.subplots(2, 2, sharex=True, sharey=True)
axes[1][0].set_xlabel('Number of activated synapses')
axes[1][0].set_xlim(0, 40)
for i, (ttx, title) in enumerate(zip(['ttx0', 'ttx1'], ['Control', 'TTX'])):
    axes[i][0].axhline(y=v_th, color='grey', linestyle='--', linewidth=1)
    axes[i][0].set_title(title, fontsize=mpl.rcParams['font.size'])
    axes[i][0].set_ylabel('Peak Vm (mV)')
    axes[i][0].set_ylim(-70., -40.)
    for c, vrest, label in zip(['k', 'r'], sorted(rec_dict.keys()), ['Resting Vm', '5 mV depolarized']):
        indexes = range(len(rec_dict[vrest][ttx]['num_syns']))
        indexes.sort(key=rec_dict[vrest][ttx]['num_syns'].__getitem__)
        num_syns = np.array(rec_dict[vrest][ttx]['num_syns'])[indexes]
        peak_vm = np.array(rec_dict[vrest][ttx]['peak_vm'])[indexes]
        axes[i][0].plot(num_syns, peak_vm, c=c, label=label)
axes[1][0].set_aspect('auto')
axes[0][0].legend(loc='best', frameon=False, framealpha=0.5)
clean_axes(axes)
fig.tight_layout()

fig, axes = plt.subplots(2, 2, sharex=True, sharey=True)
axes[1][0].set_xlabel('Synaptic AMPA-R conductance (nS)')
axes[1][0].set_xlim(0, 25)
for i, (ttx, title) in enumerate(zip(['ttx0', 'ttx1'], ['Control', 'TTX'])):
    axes[i][0].axhline(y=v_th, color='grey', linestyle='--', linewidth=1)
    axes[i][0].set_title(title, fontsize=mpl.rcParams['font.size'])
    axes[i][0].set_ylabel('Peak Vm (mV)')
    axes[i][0].set_ylim(-70., -40.)
    for c, vrest, label in zip(['k', 'r'], sorted(rec_dict.keys()), ['Resting Vm', '5 mV depolarized']):
        indexes = range(len(rec_dict[vrest][ttx]['peak_g_AMPA']))
        indexes.sort(key=rec_dict[vrest][ttx]['peak_g_AMPA'].__getitem__)
        peak_g_AMPA = np.array(rec_dict[vrest][ttx]['peak_g_AMPA'])[indexes]
        peak_vm = np.array(rec_dict[vrest][ttx]['peak_vm'])[indexes]
        axes[i][0].plot(peak_g_AMPA * 1000., peak_vm, c=c, label=label)
        # print title, label
        # print peak_g_AMPA * 1000
        # print peak_vm
axes[1][0].set_aspect('auto')
axes[0][0].legend(loc='best', frameon=False, framealpha=0.5)
clean_axes(axes)
fig.tight_layout()
plt.show()
plt.close()