ModelDB is moving. Check out our new site at https://modeldb.science. The corresponding page is https://modeldb.science/144490.

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

 Download zip file 
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]
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,"%sFormatFile = $Revision: 1.15 $, ",pkgversions)
load_file("utils.hoc")
load_file("ObjectClass.hoc")

/*

FormatFile

f = new FormatFile(String file)

Sets up a new FormatFile that will print objects to file in Matlab format.

f = new FormatFile(String file, String format)

Sets up a new FormatFile that will print objects to file in format,
where format can be "R" or "Matlab".

f = new FormatFile(String file, String format, Structname structname)

Sets up a new FormatFile that will print objects to file in format,
where format can be "R" or "Matlab" and will put every object into a
structure called structname.

f.wopen()
f.aopen()
f.ropen()
f.close()

Similar to File object functions except that they don't take an argument.

f.printdouble("double_name", double)

Prints double to f using the name double_name.

f.printvec("vector_name", vector)

Print vector to file_handle in matlab format with name vector_name.
If vector is longer than the local varible chunk_size, it is split 
into lines of chunk_size elements or less, separated by the matlab line 
continuation symbol "...".  

f.printvec("vector_name", vector, start, end)

Same as above, but only print from index start to index end.  
The start and end indeicies are in the range 0 to vector.size()-1 , 
i.e. the NEURON/C convention rather than Matlab convetion.  They 
will, however, be printed in Matlab convention.

f.printvec("vector_name", vector, start, end, row)

Same as above, but print vector as row of matrix.  Again, indicies
are from 0 to vector.size()-1.

f.printmat("matrix_name", matrix)

Prints matrix to f using the name matrix_name.

f.printlistasmat("matrix_name", list [, init_value ])

Prints list where each element is a vector as a matrix to f using the
name matrix_name.  The vectors can be different lengths.  If they are
different lengths, init_value specifies the value to give elements
that have to be filled in; the default is 0.

f.printstr("string_name", string)

Print string to file_handle in matlab format with name string_name.

f.setprintdouble("parameter_name", parameter_value)
 
Set parameter of paramater_name to parameter_value and print the
parameter name and value to file.

f.setprintstr("string_name", string_value)

set string_name to string_value and print
the string name and value to file.

*/


begintemplate FormatFile

// Public functions
public aopen
public ropen
public wopen
public close
public printdouble
public printvec
public printmat
public printlistasmat
public print_VectorList
public printstr
public setprintdouble
public setprintstr
public printf
public printobj
public printlist
public chooser
public unlink
public f


// Private variables

objref f                                // The file object
strdef format                           // The format type
strdef structname                       // Prefix string if structures present
strdef prefix                           // Prefix string if structures present
strdef filename                         // The file name

strdef openind
strdef closeind
strdef assop
strdef openvec
strdef elsep
strdef closevec
strdef linecont
strdef lineend
strdef quot

strdef tmpstr, rowstr, varname, listname

objref tmpmat, this, utils
objref oc

proc init() {
    utils = new Utils()
    // Args: Filename, Format (R or matlab), structur prefix
    start = 0
    end = 0
    row = 0
    wopened_flag = 0
    
    format = "Matlab"
    if ( numarg() >= 2 ) {
        format = $s2
        if (!(!strcmp(format, "Matlab") || !strcmp(format, "R") || !strcmp(format, "hoc"))) {
            utils.error("FormatFile: unrecognised format specified")
            return
        }
    }
    if (!strcmp(format, "Matlab")) {
        openind = "("
        closeind = ")"
        assop = "="
        openvec = "["
        elsep = " "
        closevec = "]"
        linecont = "..."
        lineend = ";"
        quot="'"
        sprint(filename,"%s.m",$s1)
    }
    if (!strcmp(format, "R")) {
        openind = "["
        closeind = "]"
        assop = "<-"
        openvec = "c("
        elsep = ","
        closevec = ")"
        linecont = ""
        lineend = ";"
        quot="\'"
        sprint(filename,"%s.R",$s1)
    }
    if (!strcmp(format, "hoc")) {
        openind = ""
        closeind = ""
        assop = "="
        openvec = ""
        elsep = " "
        closevec = ""
        linecont = ""
        lineend = ""
        quot="\""
        sprint(filename,"%s.hoc",$s1)
    }
    f = new File(filename)
        
    structflag = 0
    if ( numarg() >= 3 ) {
        structflag = 1
        structname = $s3
        if (!strcmp(format, "Matlab")) {
            sprint(prefix, "%s.", structname)
        }
        if (!strcmp(format, "R")) {
            sprint(prefix, "%s$", structname)
        }
    }
    oc = new ObjectClass()
}

// Open and closing functions inherited from File except that we only
// allow opening without a filename
// 

// For R

proc print_structname () {
    if (!strcmp(format, "R") && (wopened_flag==0) && (structflag==1)) {
        f.printf("%s <- list()%s\n", structname,lineend)
    }
    if (!strcmp(format, "hoc")) {
        initialise_hoc_file()
        wopened_flag = 1
    }

}


func aopen() { local ret
    ret = f.aopen()
    print_structname()  
    return ret
}

func ropen() {
    return f.ropen()
}

func wopen() { local ret
    wopened_flag=0
    ret = f.wopen()
    print_structname()
    return ret
}

func close() {
    return f.close()
}

//
// Utility functions
//

//
// x = min(double a, double b)
// 
// return minimum of a and b
//

func min() {
    if ( $1 < $2 ) { return $1 } else { return $2 }
}

//
// x = max(double a, double b)
// 
// return maximum of a and b
//

func max() {
    if ( $1 > $2 ) { return $1 } else { return $2 }
}


//
// Format-independent printing functions 
// 

//
// printdouble("double_name", double)
// 
proc printdouble() {
    sprint(varname, "%s%s", prefix, $s1) 
    f.printf("%s %s ", varname, assop)
    f.printf("%.10g ", $2)
    f.printf("%s\n",lineend)

}

//
// printvec
// 

proc printvec() {
    //
    // Deal with input arguments
    //
    
    sprint(varname, "%s%s", prefix, $s1) 
    
    if (numarg() == 2) {
        start = 0
        end = $o2.size() - 1
    }

    if (numarg() >= 4) {
        start = $3
        end = $4
        if (start != int(start)) { error("utils.hoc:printmvec(): start value is not an integer")}
        if (end != int(end)) { error("utils.hoc:printmvec(): end value is not an integer") }
        if (end < start ) { error("utils.hoc:printmvec(): end value is lower than start value") }
    }
    
    rowstr = ""
    if (numarg() == 5) {
        row = $5
        sprint(rowstr,"%g,",row + 1)
    }
    
    //     if (!strcmp(format, "Matlab")) {
    
    //     }
    if (!strcmp(format, "R")) {
        f.printf("%s <- c()%s\n",varname,lineend)
        f.printf("%s <- rep(NA,%g)\n",varname,$o2.size(),lineend)
    }
    
    if (!strcmp(format, "hoc")) {
        printvec_hoc(varname, $o2) 
    } else {
        printvec_generic(varname, $o2) 
    }
    
}

proc printvec_generic () { local i, chunk_size,  total_size, pos, name, blockend
    chunk_size = 10             // How many elements per line to print
    block_size = 100            // How many elements per vector to print
    
//    print "row", row, start, end 
    
    //
    // Print out values
    //
    
    // Only print if there are values to print
    if ( (end-start) >= 0 ) {

        // Loop throgh values
        for j = start, end {

            // Split vector into new vector every block_size elements 
            // as long as we're not at the end of the vector
            if (((j-start) % block_size) == 0) {

                // If not at the start of the vector, need to finish old 
                // vector
                if ( j != start ) {
                    f.printf("%s%s\n",closevec,lineend) 
                }
                f.printf("%s%s%s%g:%g%s %s %s ", varname, openind, rowstr, j+1, min((j+block_size),end+1),closeind, assop, openvec)
            } else {
                // Print separator if not end of block
                f.printf("%s", elsep)
            }
            
            // Newline and ... every chunk_size elements
            if ( ( ( j - start  ) % chunk_size ) == 0 ) {
                f.printf("%s\n", linecont) 
            }
            
            // Print out element itself 
            f.printf("%.10g", $o2.x(j))
        }
        
        // Print end of vector
        f.printf("%s%s\n",closevec,lineend) 
    }
}

proc printvec_hoc() { 
    f.printf("scan_vec_()\n")
    f.printf("%s\n", $s1)
    f.printf("%g\n", $o2.size())
    $o2.printf(f,"%.10g ")
}

//
// printmat
//
proc printmat () { local i, j, nrows, ncols
    sprint(varname, "%s%s", prefix, $s1) 
    
    if (!strcmp(format, "hoc")) {
        printmat_hoc(varname, $o2)
    } else { 
        if (numarg() == 2) {
            nrows = $o2.nrow()
            ncols = $o2.ncol()
        }
        
        // Naughty communication to printvec_generic
        start = 0
        end = ncols-1
        
        // 
        // Need to initialise matrix
        // 
        if (!strcmp(format, "R")) {
            f.printf("%s <- matrix(0, nrow=%g, ncol=%g)%s\n", varname, nrows, ncols,lineend)
        }
        
        //
        // Print out values
        //
        
        // Only print if there are values to print
        if ( (nrows >= 1)  && (ncols >=1) ) {
            
            // Loop throgh rows
            for i = 0, nrows-1 {
                
                // Use printvec_generic
                sprint(rowstr,"%g,",i + 1)
                printvec_generic(varname,$o2.getrow(i))
            }
        }
    }
}

proc printmat_hoc() { 
    f.printf("scan_mat_()\n")
    f.printf("%s\n", $s1)
    $o2.fprint(f,"%.10g ")
}

//
// printlistasmat
// 
proc printlistasmat () { local i, ncol, init_value
    //
    // Deal with input arguments
    //
    if (numarg()==3) {
        init_value = $3 
    } else {
        init_value = 0
    }
    //
    // Make a matrix big enough
    //
    if ($o2.count() > 0) {
        ncol = 0
        for i=0,$o2.count()-1 {
            if ($o2.object(i).size()>ncol) {
                ncol = $o2.object(i).size()
            }
        }
        tmpmat = new Matrix($o2.count(), ncol)
        //
        // Fill it with the vectors in the list
        //
        for i=0,$o2.count()-1 {
            tmpmat.setrow(i, init_value)
            tmpmat.setrow(i, $o2.object(i))
        }
        printmat($s1, tmpmat)
    }
}

//
// f.printstr("string_name", string)
// 

proc print_VectorList () { local i
    f.printf("%s%s %s ", prefix, $s1, assop)
    if (!strcmp(format, "R")) {
        f.printf("list()\n")
    }
    for i=0, $o2.count()-1 {
        sprint(tmpstr,"%s[[%g]]",$s1,i+1)
        printvec(tmpstr, $o2.object(i))
    }
}

proc printstr () { 
    if (!strcmp(format,"hoc")) {
        f.printf("strdef %s%s\n", prefix, $s1)
    }
    f.printf("%s%s %s ", prefix, $s1, assop)
    f.printf("%s%s%s ", quot,$s2,quot)
    f.printf(" %s\n",lineend)
}


//
// f.setprintdouble("parameter_name", parameter_value)
// 
// set parameter of paramater_name to parameter_value and print
// the parameter name and value to file.
// 

proc setprintdouble () {
    sprint(tmpstr, "%s = %.10g", $s1, $2)
    execute(tmpstr)
    printdouble($s1, $2)
}

//
// f.setprintmstr("string_name", string_value)
// 

proc setprintstr () {
    sprint(tmpstr, "strdef %s", $s1)
    execute(tmpstr)
    sprint(tmpstr, "%s = \"%s\"", $s1, $s2)
    execute(tmpstr)
    printstr($s1, $s2)
}

//
// Sometimes useful to have limited printf fucntionality
// 

proc printf() {
    if (numarg() == 2) { f.printf($s1,$s2) }
    if (numarg() == 1) { f.printf($s1) }
}

// 
// Print regardless of type
// printobj("name", object)
// 
proc printobj() {
    if (argtype(2) == 0) {               // double
        printdouble($s1, $2)
    }
    if (argtype(2) == 1) {               // object
        if (oc.object_is($o2, "Vector")) {
            printvec($s1, $o2)
        }
        if (oc.object_is($o2, "Matrix")) {
            printmat($s1, $o2)
        }
    }
    if (argtype(2) == 2) {               // string
        printstr($s1, $s2)
    }
}

//
// Print a list
// printlist("name", object)
//
proc printlist() {
    //
    // Deal with input arguments
    //
    
    sprint(listname, "%s", $s1) 
    
    if (!strcmp(format, "R")) {
        f.printf("%s <- list()%s\n", listname, lineend)
        for i=0, $o2.count()-1 {
            sprint(tmpstr,"%s[[%d]]", listname, i+1)
            printobj(tmpstr, $o2.o(i))
        }
    } else {
        utils.warning("FormatFile: printlist only supported for R format")
    }

}

proc chooser() { local i 
    sprint(tmpstr,"f.chooser(")
    for i=1,numarg() {
        if (i>=2) { 
            sprint(tmpstr,"%s,", tmpstr)
        }
        sprint(tmpstr,"%s\"%s\"", tmpstr, $si)
    } 
    
    sprint(tmpstr,"%s)",tmpstr)
    execute(tmpstr,this)
    filename = f.getname()
}

proc unlink() {
    f.unlink()
}

proc initialise_hoc_file() {
    f.printf("\
strdef tmp_name_\
strdef tmp_cmd_\
objref tmp_obj_\
")
    f.printf("\
proc scan_vec_() { local i, n\
    ")
    f.printf("\
    getstr(tmp_name_,1)\
    n = fscan()\
    tmp_obj_ = new Vector(n)\
    for i=0,n-1 {\
        tmp_obj_.x(i) = fscan()\
    }\
")    
    f.printf("\
    sprint(tmp_cmd_, \"{objref %%s}\", tmp_name_)\
    execute(tmp_cmd_)\
    ")    
    f.printf("\
    sprint(tmp_cmd_, \"{%%s = tmp_obj_}\", tmp_name_)\
    execute(tmp_cmd_)\
}\
")
    f.printf("\
proc scan_mat_() { local i, j, nrow, ncol\
    ")
    f.printf("\
    getstr(tmp_name_,1)\
    nrow = fscan()\
    ncol = fscan()\
    tmp_obj_ = new Matrix(nrow,ncol)\
    ")
    f.printf("\
    for i=0,nrow-1 {\
        for j=0,ncol-1 {\
            tmp_obj_.x[i][j] = fscan()\
        }\
    }\
")
    f.printf("\
    sprint(tmp_cmd_, \"{objref %%s}\", tmp_name_)\
    execute(tmp_cmd_)\
    ")    
    f.printf("\
    sprint(tmp_cmd_, \"{%%s = tmp_obj_}\", tmp_name_)\
    execute(tmp_cmd_)\
}\
")    
}

endtemplate FormatFile

Loading data, please wait...