Channel density variability among CA1 neurons (Migliore et al. 2018)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:244688
The peak conductance of many ion channel types measured in any given animal is highly variable across neurons, both within and between neuronal populations. The current view is that this occurs because a neuron needs to adapt its intrinsic electrophysiological properties either to maintain the same operative range in the presence of abnormal inputs or to compensate for the effects of pathological conditions. Limited experimental and modeling evidence suggests this might be implemented via the correlation and/or degeneracy in the function of multiple types of conductances. To study this mechanism in hippocampal CA1 neurons and interneurons, we systematically generated a set of morphologically and biophysically accurate models. We then analyzed the ensembles of peak conductance obtained for each model neuron. The results suggest that the set of conductances expressed in the various neuron types may be divided into two groups: one group is responsible for the major characteristics of the firing behavior in each population and the other more involved with degeneracy. These models provide experimentally testable predictions on the combination and relative proportion of the different conductance types that should be present in hippocampal CA1 pyramidal cells and interneurons.
Reference:
1 . Migliore R, Lupascu CA, Bologna LL, Romani A, Courcol JD, Antonel S, Van Geit WAH, Thomson AM, Mercer A, Lange S, Falck J, Roessert CA, Shi Y, Hagens O, Pezzoli M, Freund TF, Kali S, Muller EB, Schuermann F, Markram H, Migliore M (2018) The physiological variability of channel density in hippocampal CA1 pyramidal cells and interneurons explored using a unified data-driven modeling workflow PLOS Computational Biology
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: Hippocampus;
Cell Type(s): Hippocampus CA1 pyramidal GLU cell;
Channel(s): I h; Ca pump; I K; I K,Ca; I Calcium; I CAN; I M; I Na,t; I A; I_KD; I T low threshold; I L high threshold;
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON; BluePyOpt ;
Model Concept(s): Activity Patterns; Action Potentials; Detailed Neuronal Models; Methods; Parameter Fitting;
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; I Na,t; I L high threshold; I T low threshold; I A; I K; I M; I h; I K,Ca; I CAN; I Calcium; I_KD; Ca pump;
/
MiglioreEtAl2018PLOSCompBiol2018
morphologies
readme_file
readme.htm
cacumm.mod *
cacummb.mod
cagk.mod *
cal2.mod *
can2.mod *
cat.mod *
h.mod *
kadist.mod *
kaprox.mod *
kca.mod *
kdb.mod
kdrbca1.mod
kdrca1.mod *
kmb.mod *
na3n.mod
naxn.mod *
cell_seed1_0-bac-10.hoc
cell_seed1_0-cnac-04.hoc
cell_seed2_0-bac-06.hoc
cell_seed2_0-cnac-08.hoc
cell_seed3_0-pyr-08.hoc
cell_seed4_0-cac-06.hoc
cell_seed4_0-pyr-04.hoc
cell_seed7_0-cac-04.hoc
fig4A-model.hoc
fig4A-model.ses
mosinit.hoc
                            
/*
Created by BluePyOpt(1.5.29) at 2018-02-02 14:23:51.660653
*/
{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", -80, v_init)
}

begintemplate bACnoljp7
  public init, morphology, geom_nseg_fixed, geom_nsec
  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()

  //For compatibility with BBP CCells
  CellRef = this

  forall delete_section()

  if(numarg() >= 2) {
    load_morphology($s1, $s2)
  } else {
    load_morphology("morphologies", "011023HP2.asc")
  }

  geom_nseg()
    replace_axon()
  insertChannel()
  biophys()
  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 kdrb
    insert na3
    insert kap
  }
  forsec this.apical {
    insert hd
    insert can
    insert cal
    insert cat
    insert cagk
    insert kca
    insert cacum
  }
  forsec this.axonal {
    insert kmb
  }
  forsec this.basal {
    insert hd
    insert can
    insert cal
    insert cat
    insert cagk
    insert kca
    insert cacum
  }
  forsec this.somatic {
    insert kdb
    insert kmb
    insert hd
    insert can
    insert cal
    insert cat
    insert cagk
    insert kca
    insert cacum
  }
  forsec this.myelinated {
  }
}

proc biophys() {
  
  forsec CellRef.all {
    cm = 1
    ena = 50
    ek = -90
  }
  
  forsec CellRef.apical {
    ghdbar_hd = 5.4077011164305521e-05
    gcalbar_cal = 9.7158630058784087e-06
    gcanbar_can = 1.5204944436038115e-05
    gcatbar_cat = 5.2904098958314825e-06
    gbar_kca = 5.9697579493251004e-06
    gbar_cagk = 5.5391564656879277e-05
    Ra = 284.30710854885962
    g_pas = 6.4203453434720117e-06
    e_pas = -80.872079651004725
    gbar_na3 = 0.026548453053588428
    gkdrbar_kdrb = 0.0031137014579533974
    gkabar_kap = 0.023759340927582109
  }
  
  forsec CellRef.axonal {
    gbar_na3 = 0.13122052886930799
    gkdrbar_kdrb = 0.010985754650769362
    gkabar_kap = 0.0063057409682653323
    gbar_kmb = 0.0040230145934034471
    Ra = 170.10331627809398
    g_pas = 2.2986790039387338e-05
    e_pas = -91.09686603997153
  }
  
  forsec CellRef.basal {
    ghdbar_hd = 5.4077011164305521e-05
    gcalbar_cal = 9.7158630058784087e-06
    gcanbar_can = 1.5204944436038115e-05
    gcatbar_cat = 5.2904098958314825e-06
    gbar_kca = 5.9697579493251004e-06
    gbar_cagk = 5.5391564656879277e-05
    Ra = 284.30710854885962
    g_pas = 6.4203453434720117e-06
    e_pas = -80.872079651004725
    gbar_na3 = 0.026548453053588428
    gkdrbar_kdrb = 0.0031137014579533974
    gkabar_kap = 0.023759340927582109
  }
  
  forsec CellRef.somatic {
    gbar_na3 = 0.06893101679729946
    gkdrbar_kdrb = 0.0010067289315641276
    gkabar_kap = 0.032711790998271491
    gkdbar_kdb = 4.0450074382822514e-05
    gbar_kmb = 0.0077953469829776887
    ghdbar_hd = 5.4077011164305521e-05
    gcalbar_cal = 9.7158630058784087e-06
    gcanbar_can = 1.5204944436038115e-05
    gcatbar_cat = 5.2904098958314825e-06
    gbar_kca = 5.9697579493251004e-06
    gbar_cagk = 5.5391564656879277e-05
    Ra = 284.30710854885962
    g_pas = 6.4203453434720117e-06
    e_pas = -80.872079651004725
  }
  
  forsec CellRef.myelinated {
  }
  
}

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

                if( nSec > 1 ) {
                    access axon[1]
                    i2 = v(0.0001) // used when serializing sections prior to sim start
                } else {
                    i2 = i1
                } 

         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()

  
}


endtemplate bACnoljp7