SCN1A gain-of-function in early infantile encephalopathy (Berecki et al 2019)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:264834
"OBJECTIVE: To elucidate the biophysical basis underlying the distinct and severe clinical presentation in patients with the recurrent missense SCN1A variant, p.Thr226Met. Patients with this variant show a well-defined genotype-phenotype correlation and present with developmental and early infantile epileptic encephalopathy that is far more severe than typical SCN1A Dravet syndrome. METHODS: Whole cell patch clamp and dynamic action potential clamp were used to study T226M Nav 1.1 channels expressed in mammalian cells. Computational modeling was used to explore the neuronal scale mechanisms that account for altered action potential firing. RESULTS: T226M channels exhibited hyperpolarizing shifts of the activation and inactivation curves and enhanced fast inactivation. Dynamic action potential clamp hybrid simulation showed that model neurons containing T226M conductance displayed a left shift in rheobase relative to control. At current stimulation levels that produced repetitive action potential firing in control model neurons, depolarization block and cessation of action potential firing occurred in T226M model neurons. Fully computationally simulated neuron models recapitulated the findings from dynamic action potential clamp and showed that heterozygous T226M models were also more susceptible to depolarization block. ..."
Reference:
1 . Berecki G, Bryson A, Terhag J, Maljevic S, Gazina EV, Hill SL, Petrou S (2019) SCN1A gain of function in early infantile encephalopathy. Ann Neurol 85:514-525 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism:
Cell Type(s):
Channel(s): I Sodium;
Gap Junctions:
Receptor(s):
Gene(s): Nav1.1 SCN1A;
Transmitter(s):
Simulation Environment: NEURON; Python; BluePyOpt ;
Model Concept(s): Action Potentials; Epilepsy; Depolarization block; Development;
Implementer(s): Bryson, Alex [alexander.bryson at florey.edu.au];
Search NeuronDB for information about:  I Sodium;
/
modelDB_scn1a
mechanisms
morphologies
save
README.html
PV_template.hoc
run.py
                            
/*
Created by BluePyOpt(1.5.3) at 2020-05-02 08:46:08.997716
*/
{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 pv
  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($s1, "C210401C.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
  }
  forsec this.apical {
  }
  forsec this.axonal {
    insert Ca_LVAst
    insert Ca_HVA
    insert CaDynamics_E2
    insert SKv3_1
    insert Nav11m
    insert SK_E2
    insert K_Tst
    insert K_Pst
    insert Nap_Et2
    insert NaTa_t
    insert Nav11
    insert Im
  }
  forsec this.basal {
    insert NaTs2_t
    insert Nap_Et2
    insert Nav11
    insert Nav11m
    insert K_Tst
    insert K_Pst
    insert SKv3_1
    insert Im
    insert Ih
  }
  forsec this.somatic {
    insert NaTs2_t
    insert Nap_Et2
    insert Nav11
    insert SKv3_1
    insert SK_E2
    insert K_Tst
    insert K_Pst
    insert CaDynamics_E2
    insert Ca_HVA
    insert Ca_LVAst
    insert Nav11m
    insert Im
  }
  forsec this.myelinated {
  }
}

proc biophys() {

  forsec CellRef.all {
    Ra = 100
    g_pas = 1.1753712511359735e-07
    e_pas = -62.605486758793134
  }

  forsec CellRef.apical {
  }

  forsec CellRef.axonal {
    cm = 1
    ena = 50
    ek = -90
    gNaTa_tbar_NaTa_t = 1.8952539630604903
    gNav11bar_Nav11 = 2.9986708213550992
    gNap_Et2bar_Nap_Et2 = 9.9914521169257362e-07
    gK_Pstbar_K_Pst = 4.9798348545652884e-06
    gK_Tstbar_K_Tst = 0.0958123928067732
    gSK_E2bar_SK_E2 = 0.037731878034846213
    gSKv3_1bar_SKv3_1 = 0.356040135857974
    gCa_HVAbar_Ca_HVA = 6.6928045008285222e-06
    gCa_LVAstbar_Ca_LVAst = 0.00086252457600405862
    decay_CaDynamics_E2 = 357.51087087210146
    gamma_CaDynamics_E2 = 0.0033841884469849211
    gImbar_Im = 0.00031319601262909993
    gNav11bar_Nav11m = 0
    mh_Nav11m = -26.600000000000001
    ms_Nav11m = 6.7000000000000002
    hh_Nav11m = -60.200000000000003
    hs_Nav11m = 5.5999999999999996
    tmh_Nav11m = -40
    thh_Nav11m = -65
  }

  forsec CellRef.basal {
    cm = 1
    ena = 50
    ek = -90
    gNaTs2_tbar_NaTs2_t = 0.0020626919757689753
    gNav11bar_Nav11 = 8.7937735030300143e-06
    gNap_Et2bar_Nap_Et2 = 1.6389087983832434e-07
    gSKv3_1bar_SKv3_1 = 8.1625882332958207e-05
    gK_Pstbar_K_Pst = 4.7998069883951371e-08
    gK_Tstbar_K_Tst = 1.6848144871536559e-05
    gNav11bar_Nav11m = 0
    mh_Nav11m = -26.600000000000001
    ms_Nav11m = 6.7000000000000002
    hh_Nav11m = -60.200000000000003
    hs_Nav11m = 5.5999999999999996
    tmh_Nav11m = -40
    thh_Nav11m = -65
  }

  forsec CellRef.somatic {
    cm = 1
    ena = 50
    ek = -85
    gNaTs2_tbar_NaTs2_t = 0.95585841724208476
    gNav11bar_Nav11 = 0.21504623309972959
    gNap_Et2bar_Nap_Et2 = 7.9295968986726376e-07
    gSKv3_1bar_SKv3_1 = 0.018497365407533689
    gK_Pstbar_K_Pst = 1.8986651083545768e-05
    gK_Tstbar_K_Tst = 0.019405714609111748
    gSK_E2bar_SK_E2 = 1.6228971252382314e-08
    gCa_HVAbar_Ca_HVA = 0.00033062469952363
    gCa_LVAstbar_Ca_LVAst = 0.0011410752102358152
    decay_CaDynamics_E2 = 103.86036962355075
    gamma_CaDynamics_E2 = 0.032352264465451266
    gImbar_Im = 0.00010335472123811204
    gNav11bar_Nav11m = 0
    mh_Nav11m = -26.600000000000001
    ms_Nav11m = 6.7000000000000002
    hh_Nav11m = -60.200000000000003
    hs_Nav11m = 5.5999999999999996
    tmh_Nav11m = -40
    thh_Nav11m = -65
  }

  forsec CellRef.myelinated {
    cm = 0.02
  }

  distribute_distance(CellRef.basal, "gImbar_Im", "(-0.8696 + 2.087*exp((%.17g)*0.0031))*4.9053963032026885e-07")
  distribute_distance(CellRef.basal, "gIhbar_Ih", "(-0.8696 + 2.087*exp((%.17g)*0.0031))*4.3100495575754699e-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, i3, 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

            access axon[2]
            i3 = 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()}
            create axon[2]

            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

            create myelin[1]
            access myelin[0]{
	            L = 1000
	            diam = diams.x[count-1]
	            nseg = 5
                v(0.0001) = i3
                all.append()
                myelinated.append()
            }
            axon[1] connect myelin[0](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 pv