Multi-comp. CA1 O-LM interneuron model with varying dendritic Ih distributions (Sekulic et al 2015)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:182797
The model presented here was used to investigate possible dendritic distributions of the HCN channel-mediated current (Ih) in models of oriens-lacunosum/moleculare (O-LM) CA1 hippocampal interneurons. Physiological effects of varying the dendritic distributions consisted of examining back-propagating action potential speeds.
Reference:
1 . Sekulic V, Chen TC, Lawrence JJ, Skinner FK (2015) Dendritic distributions of I h channels in experimentally-derived multi-compartment models of oriens-lacunosum/moleculare (O-LM) hippocampal interneurons. Front Synaptic Neurosci 7:2 [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 stratum oriens lacunosum-moleculare interneuron ;
Channel(s): I Na,t; I A; I K; I K,leak; I M; I h; I K,Ca; I Calcium; I_AHP;
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Dendritic Action Potentials; Active Dendrites; Detailed Neuronal Models; Conductance distributions;
Implementer(s):
Search NeuronDB for information about:  I Na,t; I A; I K; I K,leak; I M; I h; I K,Ca; I Calcium; I_AHP;
/
SekulicEtAl2015
04525047--90nA
04610022--90nA
README.html
cad.mod *
ICaL.mod *
ICaT.mod *
Ih.mod
IKa.mod *
IKCa.mod *
Ikdrf.mod *
Ikdrfaxon.mod *
Ikdrs.mod *
Ikdrsaxon.mod *
Ikleakaxon.mod *
Ikleaksd.mod *
IMminret.mod *
IMmintau.mod *
Ipassaxon.mod *
Ipasssd.mod *
Naaxon.mod *
Nadend.mod *
Nasoma.mod *
.initactivesdRichy.hoc.swp
.ipsc-cihr.hoc.swp
active_mods.hoc
celltestt.dat
dendIh_funcs.hoc
frontiers_Fig10.hoc
ihold_funcs.hoc
init_d_lambda_Richy_trunc.hoc
init_d_lambda_Starfish_full.hoc
init_exp.hoc
init_Richy_RN.hoc
initactivesdRichy.hoc
initactivesdStarfish.hoc
initactivesdStarfishfull.hoc
iprotocol.hoc
ipsc.hoc
ipsc-cihr.hoc
mosinit.hoc
nsegfuncs.hoc
param_active_cond.hoc
params.hoc
Richytrunctest2.hoc
rn.hoc
screen.png
screen1.png
Starfishfull.hoc
Starfishtrunc.hoc
startup_R3.sh
startup_R4.sh
startup_S3.sh
startup_S4.sh
                            
// Richy
Ri = 300        // ohm cm
Cm = 0.96857    // uf/cm2
//Rm = 59156      // ohm cm2
Rmp = 5.9156      // ohm cm2
E_L = -73.588   // mV
g_KL = 9.9005e-10   // mho/cm2
maxd = 308.919 // max distance on dendrites

if (cell == 2) {

    // Starfish
    Ri = 300        // ohm cm
    Cm = 0.9        // uf/cm2
    //Rm = 39037.7    // ohm cm2
    Rmp = 3.90377    // ohm cm2
    E_L = -73.8424  // mV
    g_KL = 1.00115e-09  // mho/cm2
    maxd = 193.142  // max distance on dendrites
}

// Report on the dendritic Ih distribution we're assigning.
if (VERBOSE) {
    if (name_declared("dis")==5) {
        if (dis == 0) {
            printf("*** ASSIGNING LINEAR Ih DISTRIBUTION ***\n")
        } else if (dis == 1) {
            printf("*** ASSIGNING SIGMOIDAL Ih DISTRIBUTION ***\n")
        } else if (dis == 2) {
            printf("*** ASSIGNING EXPONENTIAL Ih DISTRIBUTION ***\n")
        }
    } else {
        printf("*** ASSIGNING LINEAR Ih DISTRIBUTION ***\n")
    }
}

// Provide gkhbar_scale as an argument, but don't require it. sf = scale factor. Needed so that the arg has a
// different name than the actual variable used. A messy solution, however.
gkhbar_scale = 1
if (name_declared("gkhbar_sf") == 5) {
    gkhbar_scale = gkhbar_sf
}
if (VERBOSE) {
    printf("*** WE HAVE gkhbar_scale %g\n", gkhbar_scale)
}   

soma[0] distance()

NOT_YET_DISPLAYED = 1

proc init() {
  // optimizer adjusts Ri, Cm, Rm, but NEURON uses Ra, cm, g_pas
  //holdclamp.amp = -0.0011-(h*10^4/0.01)*(0.0018599+arbOff)
  max_distance = 0

  min_gkhbar = h
  strdef min_gkhbar_secname
  min_gkhbar_secname = secname()
  max_gkhbar_x = 0

  max_gkhbar = 0
  strdef max_gkhbar_secname
  max_gkhbar_secname = secname()
  max_gkhbar_x = 0

  Gh = h * gkhbar_scale

  Rm = Rmp * 10^4
  
  forall {
    Ra = Ri
    cm = Cm

    if (issection("axon.*")) {
      g_passaxon= 1/Rm
      erev_passaxon = E_L
      gkl_Kleakaxon = g_KL
    } else if (issection("soma.*")) {
      gkhbar_Ih = Gh

      t1_Ih = t1
      t2_Ih = t2
      t3_Ih = t3
      t4_Ih = t4
      t5_Ih = t5
      t6_Ih = t6
      t7_Ih = t7
      t8_Ih = t8

      g_passsd = 1/Rm
      erev_passsd = E_L
      gkl_Kleaksd = g_KL
    } else {
      // dendrites

      g_passsd = 1/Rm
      erev_passsd = E_L
      gkl_Kleaksd = g_KL

      // Measure this here, before we get into hD issues.
      if (distance(x) > max_distance) {
        max_distance = distance(x)
      }
    }

    if (issection("dend.*") && hD == 1) {
      if (DEBUG) { printf("section %s nseg %d\n", secname(), nseg) }
      //gkhbar_Ih = h  // this is the default
      for (x) {
        if (DEBUG) {
          printf("in x %g with nseg %g\n", x, nseg) 
          printf("doing something in %g\n", x)
        }

        // By default just assign dendIh_growth in a linear distribution
        // Only set sigmoidal or exponential if specified. (Or linear if dis==0).
        // This way, if uniform distribution is required, only need to set dendIh_growth to zero without
        // also needing to set ``dis''.
        if (name_declared("dis")==5) {
            if (dis == 0) {
                // linear
                gkhbar_Ih(x) = (distance(x) * dendIh_growth/maxd + 1) * Gh
            } else if (dis == 1) {
                // sigmoidal
                gkhbar_Ih(x) = Gh * ( 1 +(dendIh_growth/(1 + exp((maxd/2 - distance(x))/20))) )
            } else if (dis == 2) {
                // exponential
                gkhbar_Ih(x) = Gh * exp(dendIh_growth*distance(x)/maxd)
            }
        } else {
            // linear
            gkhbar_Ih(x) = (distance(x) * dendIh_growth/maxd + 1) * Gh
        }

        // CRUCIAL: DO NOT ALLOW NEGATIVE CONDUCTANCE! (from -ve dendIh_growth)
        if (gkhbar_Ih(x) < 0) { gkhbar_Ih(x) = 0 } 
        if (VERBOSE && NOT_YET_DISPLAYED) { printf("*** GIVING gkhbar_Ih %g to %s.v(%g) at distance %g \n", gkhbar_Ih(x), secname(), x, distance(x)) }
        if (distance(x) > max_distance) {
            max_distance = distance(x)
        }
        if (gkhbar_Ih(x) < min_gkhbar) {
            min_gkhbar = gkhbar_Ih(x)
            min_gkhbar_secname = secname()
            min_gkhbar_x = x
        }
        if (gkhbar_Ih(x) > max_gkhbar) {
            max_gkhbar = gkhbar_Ih(x)
            max_gkhbar_secname = secname()
            min_gkhbar_x = x
        }
      }
      t1_Ih = t1
      t2_Ih = t2
      t3_Ih = t3
      t4_Ih = t4
      t5_Ih = t5
      t6_Ih = t6
      t7_Ih = t7
      t8_Ih = t8
    }
  }
  finitialize(v_init)
  if (cvode.active()) {
    cvode.re_init()
  } else {
    fcurrent()
  }
  frecord_init()
  if (DEBUG && NOT_YET_DISPLAYED) {
    printf("*** MAX DISTANCE IS %g\n", max_distance)
    printf("*** MIN gkhbar = %g at %s.v(%g)\n", min_gkhbar, min_gkhbar_secname, min_gkhbar_x)
    printf("*** MAX gkhbar = %g at %s.v(%g)\n", max_gkhbar, max_gkhbar_secname, max_gkhbar_x)
    printf("*** TOTAL gkhbar = %g\n", gkhbar_tot)
  }
  if (VERBOSE) {
    NOT_YET_DISPLAYED = 0
  } 
}
printf("*** [passive_props] SET CELL %d PROPS to Ri %g Cm %g Rm %g E_L %g g_KL %g\n", cell, Ri, Cm, Rm, E_L, g_KL)