Spine head calcium in a CA1 pyramidal cell model (Graham et al. 2014)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:154732
"We use a computational model of a hippocampal CA1 pyramidal cell to demonstrate that spine head calcium provides an instantaneous readout at each synapse of the postsynaptic weighted sum of all presynaptic activity impinging on the cell. The form of the readout is equivalent to the functions of weighted, summed inputs used in neural network learning rules. Within a dendritic layer, peak spine head calcium levels are either a linear or sigmoidal function of the number of coactive synapses, with nonlinearity depending on the ability of voltage spread in the dendrites to reach calcium spike threshold. ..."
Reference:
1 . Graham BP, Saudargiene A, Cobb S (2014) Spine head calcium as a measure of summed postsynaptic activity for driving synaptic plasticity. Neural Comput 26:2194-222 [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: Hippocampus;
Cell Type(s):
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Synaptic Integration;
Implementer(s): Graham, Bruce [B.Graham at cs.stir.ac.uk];
/
GrahamEtAl2014
Cells
Results
readme.html
burststim2.mod *
cad.mod
cagk.mod
carF.mod
distca.mod
distr.mod *
h.mod *
kadist.mod *
kaprox.mod *
kca.mod *
kdrca1.mod *
km.mod
na3n.mod *
naxn.mod *
nmdaca.mod *
burst_cell.hoc *
CA1PC.hoc
mosinit.hoc
randomlocation.hoc
ranstream.hoc *
run_batsyn.hoc
run_PC.hoc
screenshot1.png
screenshot2.png
screenshot3.png
setup_PC.hoc
synstim.ses
                            
// Runs a batch of simulations with different numbers of active synapses
// in a particular layer.
// Single, synchronous stimuli to all synapses
// Last update: BPG 2-5-14

{load_file("nrngui.hoc")}
cvode_active(1)

connect_random_low_start_ = 1  // low seed for mcell_ran4_init()
my_seed = 1

// number of synaptic inputs
nCA3 = 500	// apical
nCA3b = 500	// basal
nEC = 500
nBC = 0
nBSC = 0

{load_file("setup_PC.hoc")}

//*******************************************************
// Construct simulation
celsius = 34
v_init = -65
tstop = 250

// Set up cell inputs
flag_SRbranch = 0	// SR sublists: 1=prox branch, 2=dist br, 3=all prox, 4=all dist, 5=trunk 1, 6=trunk 2, 7=trunk1&2
if (flag_SRbranch == 1) { forsec cell.SRbrp_list nseg=11 }
makeCA3()
makeCA3b()
flag_ECbranch = 0	// set to 1 if EC synapses on single branch, 2=trunk group
makeEC()
makeBC()
makeBSC()

// Data recordings
objref ca_vec, syn_vec, mean_vec, std_vec, g

// Batch of simulations
LAYER_SYN = 1	// 1=SR, 2=SO, 3=SLM
START_SYN = 0	// index of first synapse within layer
FIN_SYN = 499	// stimulate from START_SYN to FIN_SYN synapses
INC_SYN = 20	// increment to number of synapses

STTIME = 50	// stimulus time (msecs)
STRAN = 0	// start time distribution interval (msecs) (BPG 20-2-14)
STNUM = 1	// number of stimuli
STINT = 1000	// single input
STBLEN = 1000

// Extract synaptic weights for reuse
if (LAYER_SYN == 1) {		// SR
  FIRST_SYN = 0
  AM = CAWGT
  NM = CNWGT
}
if (LAYER_SYN == 2) {	// SO
  FIRST_SYN = nCA3
  AM = CAWGTb
  NM = CNWGTb
}
if (LAYER_SYN == 3) {	// SLM
  FIRST_SYN = nCA3+nCA3b
  AM = ECWGT
  NM = ECNWGT
}

// Set used weights here manually
AM = 0.0005	// CA3	
NM = 0.001
//AM = 0.0001	// EC
//NM = 0.0008

// Initialise synaptic weights and stimuli
CNUM = 0
CAWGT = 0
CNWGT = 0
CAWGTb = 0
CNWGTb = 0
ECNUM = 0
ECWGT = 0
ECNWGT = 0
// fixed CA3 input
//nCA3=200
//CSTART = 50
//CRAN = 0	// start time distribution interval (BPG 20-2-14)
//CNUM = 1
//CINT = 1000
//CBLEN = 5000
//CAWGT = 0.0005
//CNWGT = 0.001
// fixed EC input
//nEC=200
//ECSTART = 50
//ECNUM = 1
//ECINT = 1000
//ECBLEN = 1000
//ECWGT = 0.0001
//ECNWGT = 0.0008
setCA3()
setCA3b()
setEC()
for (i=0; i<START_SYN; i=i+1) {
  // activate initial synapses
  if (LAYER_SYN == 1) {		// SR
    CA3list.o(i).stim.number = STNUM
    CA3list.o(i).stim.start = STTIME
    if (STRAN > 0) {	// uniform distribution of start times (BPG 20-2-14)
      CA3list.o(i).stim.start = STTIME+rs.r.uniform(0, STRAN)
    }
    CA3list.o(i).stim.interval = STINT
    CA3list.o(i).stim.burstlen = STBLEN
    ncCA3list.o(i).weight = AM	
    ncCA3Nlist.o(i).weight = NM	
  }
  if (LAYER_SYN == 2) {	// SO
    CA3list.o(i+nCA3).stim.number = STNUM
    CA3list.o(i+nCA3).stim.start = STTIME
    CA3list.o(i+nCA3).stim.interval = STINT
    CA3list.o(i+nCA3).stim.burstlen = STBLEN
    ncCA3list.o(i+nCA3).weight = AM	
    ncCA3Nlist.o(i+nCA3).weight = NM	
  }
  if (LAYER_SYN == 3) {	// SLM
    EClist.o(i).stim.number = STNUM
    EClist.o(i).stim.start = STTIME
    EClist.o(i).stim.interval = STINT
    EClist.o(i).stim.burstlen = STBLEN
    ncEClist.o(i).weight = AM	
    ncECNlist.o(i).weight = NM	
  }  
}

tstop = 200

// Run batch of simulations
syn_vec = new Vector()
mean_vec = new Vector()
std_vec = new Vector()
for (i=START_SYN+INC_SYN; i<=FIN_SYN+1; i=i+INC_SYN) {

  //print "Synapses = ", i

  for (j=i-INC_SYN; j<i; j=j+1) {
    // activate next group of synapses (to add to total)
    if (LAYER_SYN == 1) {		// SR
      CA3list.o(j).stim.number = STNUM
      CA3list.o(j).stim.start = STTIME
      if (STRAN > 0) {	// uniform distribution of start times (BPG 20-2-14)
        CA3list.o(j).stim.start = STTIME+rs.r.uniform(0, STRAN)
      }
      CA3list.o(j).stim.interval = STINT
      CA3list.o(j).stim.burstlen = STBLEN
      ncCA3list.o(j).weight = AM	
      ncCA3Nlist.o(j).weight = NM	
    }
    if (LAYER_SYN == 2) {	// SO
      CA3list.o(j+nCA3).stim.number = STNUM
      CA3list.o(j+nCA3).stim.start = STTIME
      CA3list.o(j+nCA3).stim.interval = STINT
      CA3list.o(j+nCA3).stim.burstlen = STBLEN
      ncCA3list.o(j+nCA3).weight = AM	
      ncCA3Nlist.o(j+nCA3).weight = NM	
    }
    if (LAYER_SYN == 3) {	// SLM
      EClist.o(j).stim.number = STNUM
      EClist.o(j).stim.start = STTIME
      EClist.o(j).stim.interval = STINT
      EClist.o(j).stim.burstlen = STBLEN
      ncEClist.o(j).weight = AM	
      ncECNlist.o(j).weight = NM	
    }
  }
  
  // run simulation
  finitialize(v_init)
  run()
  
  // collect results
  ca_vec = new Vector()
  forsec cell.spine_list { ca_vec.append(camax_dca(0.5)) }
  if (i==1) {
    print "syns = ", i, " mean = ", ca_vec.x[FIRST_SYN], " std dev = 0"
    syn_vec.append(i)
    mean_vec.append(ca_vec.x[FIRST_SYN])
    std_vec.append(0)
  } else {
    print "syns = ", i, " mean = ", ca_vec.mean(FIRST_SYN,FIRST_SYN+i-1), " std dev = ", ca_vec.stdev(FIRST_SYN,FIRST_SYN+i-1)
    syn_vec.append(i)
    mean_vec.append(ca_vec.mean(FIRST_SYN,FIRST_SYN+i-1))
    std_vec.append(ca_vec.stdev(FIRST_SYN,FIRST_SYN+i-1))
  }
    
}
        
// plot results
g = new Graph()
mean_vec.plot(g, syn_vec)

// store peak calcium across all spine heads
objref fo
strdef fs, fno
fs = "SR"
sprint(fno,"./Results/%s_camaxav_spnum.dat", fs)
fo = new File(fno)
fo.wopen()
for i=0, syn_vec.size-1 {
  fo.printf("%g %g %g\n", syn_vec.x[i], mean_vec.x[i], std_vec.x[i])
}
fo.close()
      

Loading data, please wait...