CA1 pyramidal neuron: synaptically-induced bAP predicts synapse location (Sterratt et al. 2012)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:144490
This is an adaptation of Poirazi et al.'s (2003) CA1 model that is used to measure BAP-induced voltage and calcium signals in spines after simulated Schaffer collateral synapse stimulation. In the model, the peak calcium concentration is highly correlated with soma-synapse distance under a number of physiologically-realistic suprathreshold stimulation regimes and for a range of dendritic morphologies. There are also simulations demonstrating that peak calcium can be used to set up a synaptic democracy in a homeostatic manner, whereby synapses regulate their synaptic strength on the basis of the difference between peak calcium and a uniform target value.
Reference:
1 . Sterratt DC, Groen MR, Meredith RM, van Ooyen A (2012) Spine calcium transients induced by synaptically-evoked action potentials can predict synapse location and establish synaptic democracy. PLoS Comput Biol 8:e1002545 [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;
Brain Region(s)/Organism:
Cell Type(s): Hippocampus CA1 pyramidal GLU cell;
Channel(s): I Na,t; I L high threshold; I T low threshold; I A; I K; I M; I Mixed; I R; I_AHP;
Gap Junctions:
Receptor(s): AMPA; NMDA;
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Dendritic Action Potentials; Synaptic Plasticity;
Implementer(s): Sterratt, David ; Groen, Martine R [martine.groen at gmail.com];
Search NeuronDB for information about:  Hippocampus CA1 pyramidal GLU cell; AMPA; NMDA; I Na,t; I L high threshold; I T low threshold; I A; I K; I M; I Mixed; I R; I_AHP;
/
bpap
CA1_multi
datastore
pars
plots
poirazi-nmda-car
tests
validation-plots
README.txt
ampa_forti.mod
cacum.mod
cad.mod *
cagk.mod
cal.mod
calH.mod
car.mod
car_mag.mod
cat.mod
d3.mod *
h.mod
hha_old.mod
hha2.mod
kadist.mod
kaprox.mod
kca.mod
km.mod
nap.mod
nmda_andr.mod
somacar.mod
binaverages.m
bpap-cell.hoc
bpap-data.hoc
bpap-dendburst.hoc
bpap-graphics.hoc
bpap-gui.hoc
bpap-gui.ses
bpap-pars.hoc
bpap-record.hoc
bpap-run.hoc
bpap-scaling.hoc
bpap-sims.hoc
bpap-sims-cell1.hoc
bpap-sims-cell2.hoc
bpap-sims-scaling.hoc
bpap-somainj.hoc
bpap-spiketrain.hoc
ca1_mrg_cell1.hoc
ca1_mrg_cell2.hoc
ca1_poirazi.hoc
ChannelBlocker.hoc
CrossingFinder.hoc
epspsizes.hoc
figure-example.R
figures.R
figures-common.R
FileUtils.hoc
FormatFile.hoc
ghk.inc
GraphUtils.hoc
Integrator.hoc
Makefile
mosinit.hoc
NmdaAmpaSpineSynStim.hoc
NmdaAmpaSynStim.hoc
ObjectClass.hoc
plotscalingresults_pergroup1.m
plotscalingresults5.m
PointProcessDistributor.hoc
ReferenceAxis.hoc
removezeros.m
RPlot.hoc
scaling_plots.m
Segment.hoc
SimpleSpine.hoc
Spine.hoc
TreePlot.hoc
TreePlotArray.hoc
triexpsyn.inc
units.inc
utils.hoc
validate-bpap.hoc
VarList.hoc
VCaGraph.hoc
                            
if (name_declared("pkgversions") != 4 ) {  execute("strdef pkgversions") }
sprint(pkgversions,"%sPointProcessDistributor = $Revision: 1.5 $, ",pkgversions)

/*
PointProcessDistributor

ppd = new PointProcessDistributor(double seed)

Initialises the PointProcessDistributor ppd with seed for random
number generation.

ppd.setup_probs_from_seglist_with_refaxis() (SegmentList seglist, ReferenceAxis ra String expr)

Assigns relative probabilities of placement to each segement in the
SegmentList seglist on the basis of the expression expr which can
contain the following variables:

H - projection of segment onto reference axis ra
d - mean diameter of segment
l - length of segment.  

ppd.distribute_pps_from_list(List pplist)

Distribute point processes from the list pplist over the segments
contained in the seglist argument given to the setup function.

*/

begintemplate PointProcessDistributor

// Public variables

public total_length, dist, lengths, relprob

// Public functions

public setup_probs_from_seglist_with_refaxis
public distribute_pps_from_list

public loc, distribute_array, setup     // obselete?

// Private variables

objectvar seclist, ran, seglist, refaxis
strdef distexpr                         // The expression of the distribution as a string
objref lengths                          // Lengths of each segment
objref relprob                          // Relative probability of pp in segment
objref RP                               // Vector to store culumulative relative prob
objref pplist                           // List of point processes to add

objref this                             // Self-pointer
strdef tmpstr

// Function declarations

proc init() { 
    ran = new Random($1)
    d = 0
    l = 0 
    rp = 0
    i = 0                               // Index must be visible in this
}

proc setup_probs_from_seglist_with_refaxis() { 
    seglist = $o1
    refaxis = $o2
    distexpr = $s3
    lengths = new Vector()
    relprob = new Vector()
    
    for i=0, seglist.srl.count()-1 {
        // Path distance
        // We could get the path distance with 
        // seglist.srl.object(i).secref.sec s = distance(seglist.srl.object(i).x)
        // but we wouldn't be able to incorporate it into expressions with 
        // h, l and d.  This will require a change to ReferenceAxis.hoc to fix
        
        // Calculate and store the relative probability
        sprint(tmpstr,"rp = refaxis.apply_expr_to_segref(seglist.srl.object(i),\"%s\")",distexpr)
        execute(tmpstr,this)
        relprob.append(rp)
    }
}

// distribute_pps_from_list(List pplist)
func distribute_pps_from_list() { local  i, N
    if ( relprob.sum() == 0 ) { 
        print "PointProcessDistributor: Warning: No Point processes fall in the range specified"
        return 0
    }
    // Read in the point process list
    pplist = $o1
    N = pplist.count()
    if (numarg()==2) { $o2 = new Vector(N) }
    if (N == 0) { return(1) }
    
    // Set up uniform distribution between 0 and relprob.sum()
    ran.uniform(0, relprob.sum() )
    
    // Sample from the distribution
    RP = new Vector(N)
    RP.setrand(ran)
    RP.sort()
    
    RPind = 0
    culmrelprob = 0 
    
    // Look at all the segments
    for i = 0, seglist.srl.count()-1 {
        // Add the probablilty for this segment to the culumuative 
        // probability distribution and increment the counter 
        //            print relprobind, relprob.size()
        culmrelprob = culmrelprob + relprob.x(i)
        
        // Has the culmulative distribution exceeded the 
        // culmulative values for any synapses we want to add?
        //            print "1:", RPind, RP.size()
        while ( RP.x(RPind) < culmrelprob ) {
            // Locate the point process
            seglist.srl.object(i).secref.sec pplist.object(RPind).loc(seglist.srl.object(i).x)
            if (numarg()==2) { $o2.x(RPind)=i }
            RPind = RPind + 1 
            if (RPind == N) { break }
        }
        if (RPind == N) { break }
    }
    return(0)
}

proc setup() { local ltot, a
    seclist = $o1
    distexpr = $s1

    lengths = new Vector()
    relprob = new Vector()

    total_length = 0

    // Traverse the tree
    forsec seclist { 
        l = 0
        ltot = 0
        // Look at each segment in the section
        for ( x ) {
            // Don't look at the beginning or end of the section 
            if ( (x == 0) || (x == 1) ) {
                continue
            }
            // Otherwise, the relative length is given by 
            l = 2 * ( x*L - ltot ) 
            ltot = ltot + l
            

            // Store for future reference
            lengths.append(l)
            d = distance(x)
            // Calculate and store the relative 
            sprint(tmpstr,"rp = (%s)*l",distexpr)
            // print tmpstr
            // sprint(tmpstr,"rp = d")
            // a = ((d<500) && (d>100))
            // print a
            execute(tmpstr,this)
            //            if (d > 500) { print d, rp}

            // print rp
            relprob.append(rp)
//            if (!strcmp("apical[72]",secname())){  
//                print x, distance(x), rp, (relprob.size() -1)
//            }

        }
    }
}

// distribute_array("array_name",array_size)
func distribute_array () { local  i, N
    N = $2
    if ( relprob.sum() == 0 ) { 
        print "PointProcessDistributor: Warning: No synapses fall in the range specified"
        return 0
    }
    ran.uniform(0, relprob.sum() )
    RP = new Vector($2)
    RP.setrand(ran)
    RP.sort()
    RPind = 0
    relprobind = 0
    culmrelprob = 0 
    
    // Traverse the tree
    forsec seclist { 
        // Look at each segment in the section
        for ( x ) {
            // Don't look at the beginning or end of the section 
            if ( (x == 0) || (x == 1) ) {
                continue
            }
            
            // Add the probablilty for this segment to the culumuative 
            // probability distribution and increment the counter 
//            print relprobind, relprob.size()
            culmrelprob = culmrelprob + relprob.x(relprobind)
            relprobind = relprobind + 1
            
            // Has the culmulative distribution exceeded the 
            // culmulative values for any synapses we want to add?
//            print "1:", RPind, RP.size()
            while ( RP.x(RPind) < culmrelprob ) {
                sprint(tmpstr,"%s[%g].loc(%g)",$s1,RPind,x)
                d = distance(x)
//                print tmpstr, secname(), relprobind-1, relprob.x(relprobind-1)
                execute(tmpstr)
                // if (RPind < (N-1)) {
                RPind = RPind + 1 
//                print "2:", RPind, RP.size()
                if (RPind == N) { break }
//                print "2a:", RPind, RP.size()
            }
//            print "3a:", RPind, RP.size()
            if (RPind == N) { break }
//            print "3:", RPind, RP.size()
        }
        if (RPind == N) { break }        
    }
    return(1)
}

//ppd.loc(PointProcess p)

//relocates the PointProcess to a random location with respect to
//uniform distribution based on position.
//SectionList defines the set of sections to sample.
//PointProcess must have a loc() member function.
//There must be a default section declared to measure distance from.


endtemplate PointProcessDistributor