/* ---------------------------------------------
     Define the Density Mechanisms 
----------------------------------------------*/

// --------------------------------------------
//  Install Passive Properties
// --------------------------------------------

proc install_passive() {
    
  // Forall
  forall {
    insert pas
    Ra = ra 
    cm = c_m 
    g_pas = 1/rm
    e_pas = v_init
  }

  soma.cm=soma_cm
  // Exceptions along the myelinated axon
  forsec "myelin" cm = cm_myelin
  forsec "node" g_pas = g_pas_node
}


// --------------------------------------------
//  Install Active Channels
// --------------------------------------------

proc  install_channels() {

  /* Add all kinds of channels to all sections*/  
    forall {
      insert na gbar_na=0
      insert na12  gbar_na12=0
      insert na16  gbar_na16=0
      insert kv    gbar_kv=0
      insert km    gbar_km=0
      insert kca   gbar_kca=0
      insert ca    gbar_ca=0
     }
  
    // Added by Hu    
    vshift_na12 = -35 - vhalf_na12 -10  // negative shift of input voltage, high threshold  -30mV    
    vshift_na16 = -35 - vhalf_na16 -10    // positive shift of input voltage, low threshold  -43mV
    vshift_na = -35 - vhalf_na -10  // the same as Na12

  
  /* Channel Constants */
    forall if(ismembrane("k_ion")) ek = Ek
    forall if(ismembrane("na_ion")) ena = Ena
    forall if(ismembrane("ca_ion")) {
      eca = Eca
      ion_style("ca_ion",0,1,0,0,0)
      vshift_ca = 0
    }
  
  /* Somatodendritic */
    forsec somatodendritic {
      gbar_na = gna12_dend    // 80
      gbar_kv = gkv_dend        // 20                            
      gbar_km  = gkm            // 0.3                           
      gbar_kca = gkca           // 0.3                           
      gbar_ca = gca             // 0.3                           
      insert cad                // Internal calcium concentration mechanism only at somatodendritic region.
    }
    soma {
      gbar_na=gna12_soma          // 80
      gbar_kv = gkv_soma            // 20 
      gbar_km = gkm_soma            // 0.3
      gbar_kca = gkca_soma          // 0.3
      gbar_ca = gca_soma            // 0.3
    }
  
  /* hill -> ais[0] -> ... -> ais[9] */
    
    // Nav 1.2   ( gna12_ais_max=3200, refer to "Nav% iseg.xls")   
    hill.gbar_na12= gna12_ais_max     		*	1	*	0.8                     
    ais[0]. gbar_na12= gna12_ais_max      *	0.96	*	1                  								
    ais[1]. gbar_na12= gna12_ais_max  		*	0.9	*	1                    
    ais[2]. gbar_na12= gna12_ais_max  		*	0.75	*	1                  
    ais[3]. gbar_na12= gna12_ais_max  		*	0.55	*	0.95               
    ais[4]. gbar_na12= gna12_ais_max  		*	0.366985879	*	0.880142857  
    ais[5]. gbar_na12= gna12_ais_max  		*	0.2	*	0.75                 
    ais[6]. gbar_na12= gna12_ais_max  		*	0.100330761	*	0.647857143  
    ais[7]. gbar_na12= gna12_ais_max  		*	0.011532125	*	0.520285714  
    ais[8]. gbar_na12= gna12_ais_max  		*	0	*	0.428571429            
    ais[9]. gbar_na12= gna12_ais_max  		*	0	*	0.342857143            
  	
    // Nav 1.6  ( gna16_ais_max=3200, refer to "Nav% iseg.xls" )
    hill.gbar_na16 = gna16_ais_max	    *	0	*	0.8 
    ais[0]. gbar_na16 = gna16_ais_max	*	0.04	*	1   
    ais[1]. gbar_na16 = gna16_ais_max	*	0.1	*	1   
    ais[2]. gbar_na16 = gna16_ais_max	*	0.25	*	1   
    ais[3]. gbar_na16 = gna16_ais_max	*	0.45	*	0.95   
    ais[4]. gbar_na16 = gna16_ais_max	*	0.633014121	*	0.880142857   
    ais[5]. gbar_na16 = gna16_ais_max	*	0.8	*	0.75   
    ais[6]. gbar_na16 = gna16_ais_max	*	0.899669239	*	0.647857143   
    ais[7]. gbar_na16 = gna16_ais_max	*	0.988467875	*	0.520285714   
    ais[8]. gbar_na16 = gna16_ais_max	*	1	*	0.428571429   
    ais[9]. gbar_na16 = gna16_ais_max	*	1	*	0.342857143   
                                     
    // Kv delayed rectifier channels  ( gkv_axon=1000 )
    hill.gbar_kv = gkv_axon	*	0.1              
    ais[0]. gbar_kv = gkv_axon	*	0.2 
    ais[1]. gbar_kv = gkv_axon	*	0.3 
    ais[2]. gbar_kv = gkv_axon	*	0.4 
    ais[3]. gbar_kv = gkv_axon	*	0.5 
    ais[4]. gbar_kv = gkv_axon	*	0.6 
    ais[5]. gbar_kv = gkv_axon	*	0.7 
    ais[6]. gbar_kv = gkv_axon	*	0.8 
    ais[7]. gbar_kv = gkv_axon	*	0.9
    ais[8]. gbar_kv = gkv_axon	*	1
    ais[9]. gbar_kv = gkv_axon	*	1
    
    
  /*  Nakeaxon */
    nakeaxon  {
      gbar_na16 = gna16_nakeaxon	    // 300, artificial (ought to be 1600)
      gbar_na12 = 0
      gbar_kv = 1500
    }  
    
  /* ( Myelin[0] Node[0] ) -> ... -> ( Myelin[n_myelin] Node[n_myelin] )  */
    forsec "myelin" gbar_na = gna12_myelin    // 20
    forsec "node" gbar_na16 = gna16_ais_max/2  // 1600 

}

proc  install_channels_stoch() {

  /* Add all kinds of channels to all sections*/
    forall {
      insert na_stoch gbar_na_stoch=0
      insert na12_stoch  gbar_na12_stoch=0
      insert na16_stoch  gbar_na16_stoch=0
      insert kv    gbar_kv=0
      insert km    gbar_km=0
      insert kca   gbar_kca=0
      insert ca    gbar_ca=0
     }

    // Added by Hu
    vshift_na12_stoch = -35 - vhalf_na12_stoch -10  // negative shift of input voltage, high threshold  -30mV
    vshift_na16_stoch = -35 - vhalf_na16_stoch -10    // positive shift of input voltage, low threshold  -43mV
    vshift_na_stoch = -35 - vhalf_na_stoch -10  // the same as Na12



  /* Channel Constants */
    forall if(ismembrane("k_ion")) ek = Ek
    forall if(ismembrane("na_ion")) ena = Ena
    forall if(ismembrane("ca_ion")) {
      eca = Eca
      ion_style("ca_ion",0,1,0,0,0)
      vshift_ca = 0
    }

  /* Somatodendritic */
    forsec somatodendritic {
      gbar_na_stoch = gna12_dend    // 80
      gbar_kv = gkv_dend        // 20
      gbar_km  = gkm            // 0.3
      gbar_kca = gkca           // 0.3
      gbar_ca = gca             // 0.3
      insert cad                // Internal calcium concentration mechanism only at somatodendritic region.
    }
    soma {
      gbar_na_stoch=gna12_soma          // 80
      gbar_kv = gkv_soma            // 20
      gbar_km = gkm_soma            // 0.3
      gbar_kca = gkca_soma          // 0.3
      gbar_ca = gca_soma            // 0.3
    }

  /* hill -> ais[0] -> ... -> ais[9] */

    // Nav 1.2   ( gna12_ais_max=3200, refer to "Nav% iseg.xls")
    hill.gbar_na12_stoch= gna12_ais_max     		*	1	*	0.8
    ais[0]. gbar_na12_stoch= gna12_ais_max      *	0.96	*	1
    ais[1]. gbar_na12_stoch= gna12_ais_max  		*	0.9	*	1
    ais[2]. gbar_na12_stoch= gna12_ais_max  		*	0.75	*	1
    ais[3]. gbar_na12_stoch= gna12_ais_max  		*	0.55	*	0.95
    ais[4]. gbar_na12_stoch= gna12_ais_max  		*	0.366985879	*	0.880142857
    ais[5]. gbar_na12_stoch= gna12_ais_max  		*	0.2	*	0.75
    ais[6]. gbar_na12_stoch= gna12_ais_max  		*	0.100330761	*	0.647857143
    ais[7]. gbar_na12_stoch= gna12_ais_max  		*	0.011532125	*	0.520285714
    ais[8]. gbar_na12_stoch= gna12_ais_max  		*	0	*	0.428571429
    ais[9]. gbar_na12_stoch= gna12_ais_max  		*	0	*	0.342857143

    // Nav 1.6  ( gna16_ais_max=3200, refer to "Nav% iseg.xls" )
    hill.gbar_na16_stoch = gna16_ais_max	    *	0	*	0.8
    ais[0]. gbar_na16_stoch = gna16_ais_max	*	0.04	*	1
    ais[1]. gbar_na16_stoch = gna16_ais_max	*	0.1	*	1
    ais[2]. gbar_na16_stoch = gna16_ais_max	*	0.25	*	1
    ais[3]. gbar_na16_stoch = gna16_ais_max	*	0.45	*	0.95
    ais[4]. gbar_na16_stoch = gna16_ais_max	*	0.633014121	*	0.880142857
    ais[5]. gbar_na16_stoch = gna16_ais_max	*	0.8	*	0.75
    ais[6]. gbar_na16_stoch = gna16_ais_max	*	0.899669239	*	0.647857143
    ais[7]. gbar_na16_stoch = gna16_ais_max	*	0.988467875	*	0.520285714
    ais[8]. gbar_na16_stoch = gna16_ais_max	*	1	*	0.428571429
    ais[9]. gbar_na16_stoch = gna16_ais_max	*	1	*	0.342857143

    // Kv delayed rectifier channels  ( gkv_axon=1000 )
    hill.gbar_kv = gkv_axon	*	0.1
    ais[0]. gbar_kv = gkv_axon	*	0.2
    ais[1]. gbar_kv = gkv_axon	*	0.3
    ais[2]. gbar_kv = gkv_axon	*	0.4
    ais[3]. gbar_kv = gkv_axon	*	0.5
    ais[4]. gbar_kv = gkv_axon	*	0.6
    ais[5]. gbar_kv = gkv_axon	*	0.7
    ais[6]. gbar_kv = gkv_axon	*	0.8
    ais[7]. gbar_kv = gkv_axon	*	0.9
    ais[8]. gbar_kv = gkv_axon	*	1
    ais[9]. gbar_kv = gkv_axon	*	1


  /*  Nakeaxon */
    nakeaxon  {
      gbar_na16_stoch = gna16_nakeaxon	    // 300, artificial (ought to be 1600)
      gbar_na12_stoch = 0
      gbar_kv = 1500
    }

  /* ( Myelin[0] Node[0] ) -> ... -> ( Myelin[n_myelin] Node[n_myelin] )  */
    forsec "myelin" gbar_na_stoch = gna12_myelin    // 20
    forsec "node" gbar_na16_stoch = gna16_ais_max/2  // 1600

}