Circadian rhythmicity shapes astrocyte morphology and neuronal function in CA1 (McCauley et al 2020)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:257027
Most animal species operate according to a 24-hour period set by the suprachiasmatic nucleus (SCN) of the hypothalamus. The rhythmic activity of the SCN modulates hippocampal-dependent memory, but the molecular and cellular mechanisms that account for this effect remain largely unknown. In McCauley et al. 2020 [1], we identify cell-type specific structural and functional changes that occur with circadian rhythmicity in neurons and astrocytes in hippocampal area CA1. Pyramidal neurons change the surface expression of NMDA receptors. Astrocytes change their proximity clustered excitatory synaptic inputs, ultimately shaping hippocampal-dependent learning in vivo. We identify to synapses. Together, these phenomena alter glutamate clearance, receptor activation and integration of temporally corticosterone as a key contributor to changes in synaptic strength. These findings highlight important mechanisms through which neurons and astrocytes modify the molecular composition and structure of the synaptic environment, contribute to the local storage of information in the hippocampus and alter the temporal dynamics of cognitive processing. [1] "Circadian modulation of neurons and astrocytes controls synaptic plasticity in hippocampal area CA1" by J.P. McCauley, M.A. Petroccione, L.Y. D’Brant, G.C. Todd, N. Affinnih, J.J. Wisnoski, S. Zahid, S. Shree, A.A. Sousa, R.M. De Guzman, R. Migliore, A. Brazhe, R.D. Leapman, A. Khmaladze, A. Semyanov, D.G. Zuloaga, M. Migliore and A. Scimemi. Cell Reports (2020), https://doi.org/10.1016/j.celrep.2020.108255
Reference:
1 . McCauley JP, Petroccione MA, D'Brant LY, Todd GC, Affinnih N, Wisnoski JJ, Zahid S, Shree S, Sousa AA, De Guzman RM, Migliore R, Brazhe A, Leapman RD, Khmaladze A, Semyanov A, Zuloaga DG, Migliore M, Scimemi A (2020) Circadian Modulation of Neurons and Astrocytes Controls Synaptic Plasticity in Hippocampal Area CA1. Cell Rep 33:108255 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Synapse; Channel/Receptor;
Brain Region(s)/Organism: Hippocampus;
Cell Type(s): Hippocampus CA1 pyramidal GLU cell; Astrocyte;
Channel(s): I A; I h; I M; I K; I K,Ca; Ca pump; I Calcium; I CAN; I Na,t;
Gap Junctions:
Receptor(s): AMPA; NMDA;
Gene(s):
Transmitter(s): Glutamate;
Simulation Environment: NEURON;
Model Concept(s): Synaptic Integration; Synaptic Plasticity; Detailed Neuronal Models;
Implementer(s): Migliore, Rosanna [rosanna.migliore at cnr.it]; Migliore, Michele [Michele.Migliore at Yale.edu];
Search NeuronDB for information about:  Hippocampus CA1 pyramidal GLU cell; AMPA; NMDA; I Na,t; I A; I K; I M; I h; I K,Ca; I CAN; I Calcium; Ca pump; Glutamate;
/
modelDB-Migliore-Scimemi-2020
morph
readme_file
readme.htm
cacumm.mod *
cagk.mod *
cal2.mod *
can2.mod *
cat.mod *
h.mod *
kadist.mod *
kaprox.mod *
kca.mod *
kdrca1.mod *
kmb.mod *
ltpltd.mod *
naxn.mod *
netstims.mod *
nmdanet.mod
tmgsynday.mod
cell_seed6_0_mouse1-AS.hoc
fig6C.hoc
mosinit.hoc
sim-day.ses
                            
/* o
Created by BluePyOpt(1.6.56) at 2019-04-05 10:20:15.351108
*/
{load_file("stdrun.hoc")}
{load_file("import3d.hoc")}
/*
 * Check that global parameters are the same as with the optimization
 */
proc check_parameter(/* name, expected_value, value */){
  strdef error
  if($2 != $3){
    sprint(error, "Parameter %s has different value %f != %f", $s1, $2, $3)
    execerror(error)
  }
}
proc check_simulator() {
  check_parameter("celsius", 34, celsius)
  check_parameter("v_init", -70, v_init)
}

begintemplate CA1_PC_ljp
  public init, morphology, geom_nseg_fixed, geom_nsec, gid
  public channel_seed, channel_seed_set
  public soma, dend, apic, axon, myelin
  create soma[1], dend[1], apic[1], axon[1], myelin[1]

  objref this, CellRef, segCounts

  public all, somatic, apical, axonal, basal, myelinated, APC
  objref all, somatic, apical, axonal, basal, myelinated, APC

proc init(/* args: morphology_dir, morphology_name */) {
  all = new SectionList()
  apical = new SectionList()
  axonal = new SectionList()
  basal = new SectionList()
  somatic = new SectionList()
  myelinated = new SectionList()

  //gid in this case is only used for rng seeding
  gid = 0

  //For compatibility with BBP CCells
  CellRef = this

  forall delete_section() 

  if(numarg() >= 2) {
    load_morphology($s1, $s2)
  } else {
    load_morphology("morph", "JPM041619B.swc")
  }

  geom_nseg()
    replace_axon()
  insertChannel()
  biophys()

  // Initialize channel_seed_set to avoid accidents
  channel_seed_set = 0
  // Initialize random number generators
  re_init_rng()
}

proc load_morphology(/* morphology_dir, morphology_name */) {localobj morph, import, sf, extension
  strdef morph_path
  sprint(morph_path, "%s/%s", $s1, $s2)

  sf = new StringFunctions()
  extension = new String()

  sscanf(morph_path, "%s", extension.s)
  sf.right(extension.s, sf.len(extension.s)-4)

  if( strcmp(extension.s, ".asc") == 0 ) {
    morph = new Import3d_Neurolucida3()
  } else if( strcmp(extension.s, ".swc" ) == 0) {
    morph = new Import3d_SWC_read()
  } else {
    printf("Unsupported file format: Morphology file has to end with .asc or .swc" )
    quit()
  }

  morph.quiet = 1
  morph.input(morph_path)

  import = new Import3d_GUI(morph, 0)
  import.instantiate(this)
}

/*
 * Assignment of mechanism values based on distance from the soma
 * Matches the BluePyOpt method
 */
proc distribute_distance(){local x localobj sl
  strdef stmp, distfunc, mech

  sl = $o1
  mech = $s2
  distfunc = $s3
  this.soma[0] distance(0, 0.5)
  sprint(distfunc, "%%s %s(%%f) = %s", mech, distfunc)
  forsec sl for(x, 0) {
    sprint(stmp, distfunc, secname(), x, distance(x))
    execute(stmp)
  }
}

proc geom_nseg() {
  this.geom_nsec() //To count all sections
  //TODO: geom_nseg_fixed depends on segCounts which is calculated by
  //  geom_nsec.  Can this be collapsed?
  this.geom_nseg_fixed(40)
  this.geom_nsec() //To count all sections
}

proc insertChannel() {
  forsec this.all {
    insert pas
    insert kdr
    insert nax
  }
  forsec this.apical {
    insert kad
    insert hd
    insert can
    insert cal
    insert cat
    insert kca
    insert cagk
    insert cacum
  }
  forsec this.axonal {
    insert kmb
    insert kap
  }
  forsec this.basal {
    insert kad
    insert hd
    insert can
    insert cal
    insert cat
    insert kca
    insert cagk
    insert cacum
  }
  forsec this.somatic {
    insert kmb
    insert kap
    insert hd
    insert can
    insert cal
    insert cat
    insert kca
    insert cagk
    insert cacum
  }
  forsec this.myelinated {
  }
}

proc biophys() {
  
  forsec CellRef.all {
    cm = 1
    ena = 50
    ek = -90
  }
  
  forsec CellRef.apical {
    gkdrbar_kdr = 0.0055270993957421688
    gcalbar_cal = 3.1575509224141886e-06
    gcanbar_can = 8.3243837821670623e-07
    gcatbar_cat = 1.6449327082216909e-06
    gbar_kca = 3.210675468305099e-05
    gbar_cagk = 0.00030669706151496492
    gbar_nax = 0.073919051500270616
    Ra = 327.27384393007276
    g_pas = 8.5556158557126456e-06
  }
  
  forsec CellRef.axonal {
    gbar_nax = 0.39994130911723047
    gkdrbar_kdr = 0.0050266760254191207
    gbar_kmb = 0.031801163682107718
    gkabar_kap = 0.14579312041061812
    Ra = 52.091059973471488
    g_pas = 7.3095048653079982e-05
    e_pas = -73.404743913496077
  }
  
  forsec CellRef.basal {
    gkdrbar_kdr = 0.0055270993957421688
    gcalbar_cal = 3.1575509224141886e-06
    gcanbar_can = 8.3243837821670623e-07
    gcatbar_cat = 1.6449327082216909e-06
    gbar_kca = 3.210675468305099e-05
    gbar_cagk = 0.00030669706151496492
    gbar_nax = 0.010561406939749714
    Ra = 322.51189157163469
    g_pas = 3.6087588075606985e-05
  }
  
  forsec CellRef.somatic {
    gkabar_kap = 0.097892971983605623
    gbar_nax = 0.060826138425220819
    gbar_kmb = 0.00054492051103007899
    Ra = 296.24675046819135
    g_pas = 3.3512379991579063e-05
    gkdrbar_kdr = 0.0055270993957421688
    gcalbar_cal = 3.1575509224141886e-06
    gcanbar_can = 8.3243837821670623e-07
    gcatbar_cat = 1.6449327082216909e-06
    gbar_kca = 3.210675468305099e-05
    gbar_cagk = 0.00030669706151496492
  }
  
  forsec CellRef.myelinated {
  }
  
  distribute_distance(CellRef.apical, "ghdbar_hd", "(1. + 3./100. * %.17g)*1.2343729426691662e-05")
  distribute_distance(CellRef.apical, "e_pas", "(-76.462472592243714-5*%.17g/150)")
  distribute_distance(CellRef.apical, "gkabar_kad", "(15./(1. + exp((200-%.17g)/50)))*0.00078221813902690034")
  distribute_distance(CellRef.basal, "ghdbar_hd", "(1. + 3./100. * %.17g)*1.2343729426691662e-05")
  distribute_distance(CellRef.basal, "e_pas", "(-83.861413584364811-5*%.17g/150)")
  distribute_distance(CellRef.basal, "gkabar_kad", "(15./(1. + exp((200-%.17g)/50)))*0.00078221813902690034")
  distribute_distance(CellRef.somatic, "e_pas", "(-84.349790366244605-5*%.17g/150)")
  distribute_distance(CellRef.somatic, "ghdbar_hd", "(1. + 3./100. * %.17g)*1.2343729426691662e-05")
}

func sec_count(/* SectionList */) { local nSec
  nSec = 0
  forsec $o1 {
      nSec += 1
  }
  return nSec
}

/*
 * Iterate over the section and compute how many segments should be allocate to
 * each.
 */
proc geom_nseg_fixed(/* chunkSize */) { local secIndex, chunkSize
  chunkSize = $1
  soma area(.5) // make sure diam reflects 3d points
  secIndex = 0
  forsec all {
    nseg = 1 + 2*int(L/chunkSize)
    segCounts.x[secIndex] = nseg
    secIndex += 1
  }
}

/*
 * Count up the number of sections
 */
proc geom_nsec() { local nSec
  nSecAll = sec_count(all)
  nSecSoma = sec_count(somatic)
  nSecApical = sec_count(apical)
  nSecBasal = sec_count(basal)
  nSecMyelinated = sec_count(myelinated)
  nSecAxonalOrig = nSecAxonal = sec_count(axonal)

  segCounts = new Vector()
  segCounts.resize(nSecAll)
  nSec = 0
  forsec all {
    segCounts.x[nSec] = nseg
    nSec += 1
  }
}

/*
 * Replace the axon built from the original morphology file with a stub axon
 */
    
    proc replace_axon(){local nSec, L_chunk, dist, i1, i2, count, L_target, chunkSize, L_real localobj diams, lens

     L_target = 60  // length of stub axon
     nseg0 = 5  // number of segments for each of the two axon sections

     nseg_total = nseg0 * 2
     chunkSize = L_target/nseg_total

     nSec = 0
     forsec axonal{nSec = nSec + 1}

     // Try to grab info from original axon
     if(nSec < 1){ //At least two axon sections have to be present!

         execerror("Less than two axon sections are present! Add an axon to the morphology and try again!")

     } else {

         diams = new Vector()
         lens = new Vector()

         access axon[0]
         i1 = v(0.0001) // used when serializing sections prior to sim start

         access axon[1]
         i2 = v(0.0001) // used when serializing sections prior to sim start

         count = 0
         forsec axonal{ // loop through all axon sections

	     nseg = 1 + int(L/chunkSize/2.)*2  //nseg to get diameter

         for (x) {
             if (x > 0 && x < 1) {
                 count = count + 1
                 diams.resize(count)
                 diams.x[count-1] = diam(x)
                 lens.resize(count)
                 lens.x[count-1] = L/nseg
                 if( count == nseg_total ){
                     break
                 }
             }
         }
         if( count == nseg_total ){
             break
	 }
     }

         // get rid of the old axon
         forsec axonal{delete_section()}
         execute1("create axon[2]", CellRef)

         L_real = 0
         count = 0

         // new axon dependant on old diameters
         for i=0,1{
             access axon[i]
             L =  L_target/2
             nseg = nseg_total/2

             for (x) {
                 if (x > 0 && x < 1) {
                     diam(x) = diams.x[count]
                     L_real = L_real+lens.x[count]
                     count = count + 1
                 }
             }

             all.append()
             axonal.append()

             if (i == 0) {
                 v(0.0001) = i1
             } else {
                 v(0.0001) = i2
             }
         }

         nSecAxonal = 2
         soma[0] connect axon[0](0), 1
         axon[0] connect axon[1](0), 1

         print "Target stub axon length:", L_target, "um, equivalent length: ", L_real "um"
     }

 }

    



func hash_str() {localobj sf strdef right
  sf = new StringFunctions()

  right = $s1

  n_of_c = sf.len(right)

  hash = 0
  char_int = 0
  for i = 0, n_of_c - 1 {
     sscanf(right, "%c", & char_int)
     hash = (hash * 31 + char_int) % (2 ^ 31 - 1)
     sf.right(right, 1)
  }

  return hash
}

proc re_init_rng() {localobj sf
    strdef full_str, name

    sf = new StringFunctions()

    if(numarg() == 1) {
        // We received a third seed
        channel_seed = $1
        channel_seed_set = 1
    } else {
        channel_seed_set = 0
    }


}


endtemplate CA1_PC_ljp