Inhibition of bAPs and Ca2+ spikes in a multi-compartment pyramidal neuron model (Wilmes et al 2016)

 Download zip file 
Help downloading and running models
Accession:187603
"Synaptic plasticity is thought to induce memory traces in the brain that are the foundation of learning. To ensure the stability of these traces in the presence of further learning, however, a regulation of plasticity appears beneficial. Here, we take up the recent suggestion that dendritic inhibition can switch plasticity of excitatory synapses on and off by gating backpropagating action potentials (bAPs) and calcium spikes, i.e., by gating the coincidence signals required for Hebbian forms of plasticity. We analyze temporal and spatial constraints of such a gating and investigate whether it is possible to suppress bAPs without a simultaneous annihilation of the forward-directed information flow via excitatory postsynaptic potentials (EPSPs). In a computational analysis of conductance-based multi-compartmental models, we demonstrate that a robust control of bAPs and calcium spikes is possible in an all-or-none manner, enabling a binary switch of coincidence signals and plasticity. ..."
Reference:
1 . Wilmes KA, Sprekeler H, Schreiber S (2016) Inhibition as a Binary Switch for Excitatory Plasticity in Pyramidal Neurons. PLoS Comput Biol 12:e1004768 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell;
Brain Region(s)/Organism: Neocortex; Hippocampus;
Cell Type(s): Hippocampus CA1 pyramidal cell; Neocortex V1 L6 pyramidal corticothalamic GLU cell;
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON; Python;
Model Concept(s): Dendritic Action Potentials; Synaptic Plasticity; Synaptic Integration;
Implementer(s): Wilmes, Katharina A. [katharina.wilmes at googlemail.com];
Search NeuronDB for information about:  Hippocampus CA1 pyramidal cell; Neocortex V1 L6 pyramidal corticothalamic GLU cell;
#!/usr/bin/env python

"""simple neuron model with soma and branching dendrite"""

# _title_     : neuronmodel.py
# _author_     : Katharina Anna Wilmes
# _mail_     : katharina.anna.wilmes __at__ cms.hu-berlin.de


# --Imports--
import neuron
import matplotlib.pyplot as plt
import numpy as np
import nrn
import datetime
from neuron import h, gui # adding gui makes main menu appear
from config_neuronmodel import *



# --load Neuron graphical user interface--
if not ( h('load_file("nrngui.hoc")')):
    print "Error, cannot open NEURON gui"



def make_compartment(length=150, diameter=1, nseg=5, Ra= 150, cm = 0.75):
    """
    Returns a compartment.
    """
    compartment = neuron.h.Section()
    compartment.L = length
    compartment.diam = diameter
    compartment.nseg = nseg
    compartment.Ra = Ra
    compartment.cm = cm
    return compartment


def fromtodistance(origin_segment, to_segment):
    h.distance(0, origin_segment.x, sec=origin_segment.sec)
    return h.distance(to_segment.x, sec=to_segment.sec)


class BiophysicsError(Exception):
    pass


class ShapeError(Exception):
    pass


class Neuron(object):
    """
    This class will produce Neuron objects with a soma with an apical 
    dendrite, a basal dendrite, and an oblique dendrite extending from 
    the apical one
    """


    def __init__(self):
        # morphology
        self.a_diam = params['Neuron']['a_diam'].value
        self.s_diam = params['Neuron']['s_diam'].value        
        self.d_diam = params['Neuron']['d_diam'].value
        self.d_length = params['Neuron']['d_length'].value
        self.apical_length = params['Neuron']['apical_length'].value
        self.nseg = params['Neuron']['n_seg'].value

        # passive properties
        self.Rm = params['Neuron']['R_m'].value 
        self.E = params['Neuron']['E_leak'].value 
        self.Ra = params['Neuron']['R_a'].value
        self.cm = params['Neuron']['C_m'].value
        self.gp = 1/float(self.Rm)

        # active conductances
        self.ena = params['Neuron']['E_Na'].value
        self.ek = params['Neuron']['E_K'].value
        self.gna = params['Neuron']['g_Na'].value
        self.gk = params['Neuron']['g_K'].value
        self.gk_kap = params['Neuron']['g_KA'].value  
        self.slope = params['Neuron']['slope_KA'].value
        self.gna_ais = params['Neuron']['g_Na_ais'].value
        self.gna_ais_shifted = params['Neuron']['g_Na_ais_shifted'].value   
        
        # calcium
        self.eca = params['Neuron']['E_Ca'].value
        self.git2 = params['Neuron']['git2'].value
        self.gsca = params['Neuron']['gsca'].value
        self.gbar_kca = params['Neuron']['g_KCa'].value
        self.ifca = params['Neuron']['ifca']

        self.na_vshift = params['Neuron']['ifshift'] 
        self.ais_vshift = 10
        self.dend_vshift = params['Neuron']['dend_vshift'].value


        """ creating compartments"""
        # axon inital segment
        self.ais = make_compartment(self.a_diam,self.a_diam*1.5,1)

        # soma
        self.soma = make_compartment(self.s_diam, self.s_diam,1)
        self.soma.connect(self.ais,1,0)

        # oblique branch
        self.oblique_branch = make_compartment(self.d_length, (1/5.0)*self.d_diam,self.nseg)

        # apical
        self.apical_prox = make_compartment(self.apical_length/5.0,self.d_diam,(self.nseg/5)+1)
        self.apical = make_compartment(4.0*self.apical_length/5.0,self.d_diam,(4*self.nseg/5)+1)
        self.apical_prox.connect(self.soma,1,0)
        self.apical.connect(self.apical_prox,1,0)
        
        self.oblique_branch.connect(self.apical_prox,1,0)

        # basal with branches
        self.basal_main = make_compartment(self.d_length/2.0,self.d_diam/2.0,self.nseg)
        self.basal_main.connect(self.soma,0,0)
        self.basal_branches = list()
        for i in range(2):
            branch = make_compartment(self.d_length/2.0, (2/3.0)*(self.d_diam/2.0),self.nseg)
            branch.connect(self.basal_main,1,0)
            self.basal_branches.append(branch)
        self.second_basal_branches = list()
        for i in range(4):
            branch = make_compartment(self.d_length/2.0, (2/3.0)*(2/3.0)*(self.d_diam/2.0),self.nseg)
            branch.connect(self.basal_branches[i%2],1,0)
            self.second_basal_branches.append(branch)

        # apical tuft
        self.branches = list()
        for i in range(2):
            branch = make_compartment(self.d_length, (2/3.0)*self.d_diam,self.nseg)
            branch.connect(self.apical,1,0)
            self.branches.append(branch)
        self.second_branches = list()
        for i in range(4):
            branch = make_compartment(self.d_length, (2/3.0)*(2/3.0)*self.d_diam,self.nseg)
            branch.connect(self.branches[i%2],1,0)
            self.second_branches.append(branch)

        # initialize parameters
        self.set_passive_parameters(self.gp, self.E, self.Ra)
        self.set_hh_parameters(self.ena, self.ek, self.gna, self.gk)
        self.set_kap_parameters(gkapbar = self.gk_kap, Ekap = self.ek)

        if self.ifca:
            print "ca"
            self.set_ca_parameters(gsca = self.gsca, git2 = self.git2,
            gkca = self.gbar_kca, eca = self.eca)


    def set_passive_parameters(self, gp, E, rho):
        for sec in neuron.h.allsec():
            sec.Ra = rho
            sec.insert("pas")
            for seg in sec:
                seg.pas.g = gp


    def set_hh_parameters(self, Ena, Ek, gnabar, gkbar):
        count = 0
        for sec in neuron.h.allsec():
                count += 1
                sec.insert('na3dend')
                h.vshift_na3dend = self.dend_vshift
                sec.insert('kdr')
                for seg in sec:
                    seg.gbar_na3dend = gnabar
                    seg.gkdrbar_kdr = gkbar
                    seg.ena = Ena
                    seg.ek = Ek

        if self.na_vshift:
            self.ais.gbar_na3dend = 0
            self.ais.insert('na3')
            self.ais.gbar_na3 = self.gna_ais
            self.ais.insert('na3shifted')
            h.vshift_na3shifted = self.ais_vshift
            self.ais.gbar_na3shifted = self.gna_ais_shifted
        elif not gnabar == 0:
            self.ais.gbar_na3 = self.gna_ais
        else:
            print 'no Na in ais'


    def set_ca_parameters(self, gsca, git2, gkca, eca):
        # h.distance(sec=self.soma, seg=0) # assigning seg=0 was ignored 
        h.distance(sec=self.soma)
        for sec in neuron.h.allsec():
                sec.insert('sca')
                sec.insert('cad2')
                sec.insert('kca')
                for seg in sec:
                    seg.eca = eca
                    if not sec == self.soma:
                        sec.insert('it2')
                        dist = fromtodistance(self.soma(0.5),seg)
                        if ((not sec == self.oblique_branch) and (dist > 500 and dist < 750) and (not sec in self.basal_branches)
                        and (not sec in self.second_basal_branches)):
                            seg.gcabar_it2 = git2 
                            seg.gbar_sca = gsca * 3 
                            seg.gbar_kca = gkca 
                        else:
                            seg.gcabar_it2 = 0
                            seg.gbar_sca = gsca 
                            seg.gbar_kca = gkca 

                    else:
                        for seg in sec:
                            seg.gbar_sca = gsca * 2 
                            seg.gbar_kca = gkca * 2 



    def set_kap_parameters(self, gkapbar, Ekap):
        #h.distance(sec=self.soma, seg=0) # assigning seg=0 was ignored 
        h.distance(sec=self.soma)
        for sec in neuron.h.allsec():
            sec.insert('kap')
            if not sec == self.soma:
                for seg in sec:
                    dist = fromtodistance(self.soma(0.5),seg)
                    if dist > 500:
                        dist = 500
                    seg.gkabar_kap = gkapbar*(1 + dist / (500 / self.slope))
                    seg.ek = Ekap
            else:
                self.soma.gkabar_kap = gkapbar

Loading data, please wait...