// genesis // CONSTANTS // hippocampal cell resting potl and equilibr. potls float EREST_ACT_PYR = -0.060 float ENA_PYR = 0.105 + EREST_ACT_PYR // 0.045 float EK_PYR = -0.025 + EREST_ACT_PYR // -0.085 //This will not matter much... float ECA_PYR = 0.140 + EREST_ACT_PYR // 0.080 // soma area in square meters -- will be overwritten by readcell float SOMA_A_PYR = 3.320e-9 /*---------------------------------------------------------------------------*/ // In {genesis_home}Scripts/neurokit/defaults.g //Used to set the Z_A table of the K_AHP current //Jose Manuel Ibarz, personal communication :-))) function settab2const(gate, table, imin, imax, value) str gate, table int i, imin, imax float value for (i = (imin); i <= (imax); i = i + 1) setfield {gate} {table}->table[{i}] {value} end end /*--------------------------------------------------------------------------*/ //Compartments for the cell reader. //From compartments.g function make_cylind_compartment // These default compartment parameters will be overridden by readcell float RM = 0.33333 // specific membrane resistance (ohms m^2) float CM = 0.01 // specific membrane capacitance (farads/m^2) float RA = 0.3 // specific axial resistance (ohms m) float EREST_ACT = -0.07 // resting membrane potential (volts) float len = 100.0e-6 float dia = 2.0e-6 float PI = 3.14159 float surface = len * dia * PI if (!{exists compartment}) create compartment compartment end setfield compartment \ Cm {CM * surface} \ // F Ra {4.0*RA*len / (dia*dia*PI)} \ // ohm Em {EREST_ACT} \ // V Rm {RM / surface} \ // ohm dia {dia} \ len {len} \ inject 0.0 end function make_cylind_symcompartment // These default compartment parameters can be overridden by readcell float RM = 0.33333 // specific membrane resistance (ohms m^2) float CM = 0.01 // specific membrane capacitance (farads/m^2) float RA = 0.3 // specific axial resistance (ohms m) float EREST_ACT = -0.07 // resting membrane potential (volts) float len = 100.0e-6 float dia = 2.0e-6 float PI = 3.14159 float surface = len * dia * PI if (!{exists symcompartment}) create symcompartment symcompartment end setfield symcompartment \ Cm {CM * surface} \ // F Ra {4.0*RA*len / (dia*dia*PI)} \ // ohm Em {EREST_ACT} \ // V Rm {RM / surface} \ // ohm dia {dia} \ len {len} \ inject 0.0 end //Prototype channels for the CA1 pyramidal cell /*------------------------------------------------------------------------*/ //The sodium (Na) channel //I_Na = g_Na * m^3 * h * (Vm - E_Na) function make_Na if (({exists Na})) return end create tabchannel Na setfield ^ Ek {ENA_PYR} Gbar {300*SOMA_A_PYR} Ik 0 Gk 0 Xpower 3 \ Ypower 1 Zpower 0 float xmin = -0.1 float xmax = 0.05 int xdivs = 49 // m call Na TABCREATE X {xdivs} {xmin} {xmax} int i float x, dx, y, z dx = (xmax - xmin)/xdivs x = xmin for (i = 0; i <= (xdivs); i = i + 1) y = -3.48e6 * {x - 0.011} / {{exp {(x-0.011) / -0.01294}} - 1} z = 0.12e6 * {x - 0.0059} / {{exp {(x-0.0059) / 0.00447}} - 1} setfield Na X_A->table[{i}] {y} setfield Na X_B->table[{i}] {y+z} x = x + dx end setfield Na X_A->calc_mode 0 X_B->calc_mode 0 call Na TABFILL X 3000 0 // h setupalpha Na Y 3e3 0.0 0.0 80e-3 10e-3 \ 12e3 0.0 1.0 -77e-3 -27e-3 end /*------------------------------------------------------------------------*/ //The delayed rectifier potassium (K_DR) channel //I_DR = g_DR * n^4 * (Vm - E_K) function make_K_DR if (({exists K_DR})) return end create tabchannel K_DR setfield ^ Ek {EK_PYR} Gbar {150*SOMA_A_PYR} Ik 0 Gk 0 Xpower 4 \ Ypower 0 Zpower 0 /* Cannot do this because of the singularity setupalpha K_DR X 0.0 -0.018e6 -1.0 0.0 -25e-3 \ -3.6e4 3.6e3 -1.0 -10e-3 12e-3 */ float xmin = -0.1 float xmax = 0.05 int xdivs = 49 // n call K_DR TABCREATE X {xdivs} {xmin} {xmax} int i float x, dx, y, z dx = (xmax - xmin)/xdivs x = xmin for (i = 0; i <= (xdivs); i = i + 1) y = {-18e3 * x} / {{exp {x/ -25e-3}} - 1} z = 3.6e3 * {x - 10e-3} / {{exp {(x-10e-3) / 12e-3}} - 1} setfield K_DR X_A->table[{i}] {y} setfield K_DR X_B->table[{i}] {y+z} x = x + dx end setfield K_DR X_A->calc_mode 0 X_B->calc_mode 0 call K_DR TABFILL X 3000 0 end /*------------------------------------------------------------------------*/ //The muscarinic potassium (K_M) channel // I_M = g_M * u^2 * (Vm - EK_PYR) function make_K_M if (({exists K_M})) return end create tabchannel K_M setfield ^ Ek {EK_PYR} Gbar {150*SOMA_A_PYR} Ik 0 Gk 0 Xpower 2 \ Ypower 0 Zpower 0 // u setupalpha K_M X 16 0.0 0.0 52.7e-3 -23e-3 \ 16 0.0 0.0 52.7e-3 18.8e-3 end /*------------------------------------------------------------------------*/ //The A-type transient potassium (K_A) channel // I_A = g_A * a * b * (Vm - E_K) function make_K_A if (({exists K_A})) return end create tabchannel K_A setfield ^ Ek {EK_PYR} Gbar {150*SOMA_A_PYR} Ik 0 Gk 0 Xpower 1 \ Ypower 1 Zpower 0 float xmin = -0.1 float xmax = 0.05 int xdivs = 49 // a call K_A TABCREATE X {xdivs} {xmin} {xmax} int i float x, dx, alpha, beta dx = (xmax - xmin)/xdivs x = xmin for (i = 0; i <= (xdivs); i = i + 1) alpha = -50e3 * {x + 20e-3} / \ {{exp {(x + 20e-3) / -15e-3}} - 1} beta = 0.1e6 * {x + 10e-3} / {{exp {(x + 10e-3) / 8e-3}} - 1} setfield K_A X_A->table[{i}] {alpha} setfield K_A X_B->table[{i}] {alpha+beta} x = x + dx end setfield K_A X_A->calc_mode 0 X_B->calc_mode 0 call K_A TABFILL X 3000 0 // b setupalpha K_A Y 0.15 0.0 0.0 18e-3 15e-3 \ 60 0.0 1.0 73e-3 -12e-3 end /*------------------------------------------------------------------------*/ //The calcium current // I_Ca = g_Ca * s^2 * r * (Vm-E_Ca) function make_Ca if (({exists Ca})) return end create tabchannel Ca setfield ^ Ek {ECA_PYR} Gbar {40*SOMA_A_PYR} Ik 0 Gk 0 Xpower 2 \ Ypower 1 Zpower 0 // s float xmin = -0.1 float xmax = 0.05 int xdivs = 49 call Ca TABCREATE X {xdivs} {xmin} {xmax} // For testing float add=0 float mult=0.3 int i float x, dx, alpha, beta dx = (xmax - xmin)/xdivs x = xmin for (i = 0; i <= (xdivs); i = i + 1) alpha = 0.1 * -0.16e6 * {x + 26e-3 + add} / {{exp {(x + 26e-3 + add) / -4.5e-3}} - 1} beta = 0.1 * 0.04e6 * {x + 12e-3 + add} / {{exp {(x + 12e-3 + add) / 10e-3}} - 1} setfield Ca X_A->table[{i}] {alpha} setfield Ca X_B->table[{i}] {alpha+beta} x = x + dx end setfield Ca X_A->calc_mode 0 X_B->calc_mode 0 call Ca TABFILL X 3000 0 // r setupalpha Ca Y {mult*2e3} 0.0 0.0 {94e-3 + add} 10e-3 \ {mult*8e3} 0.0 1.0 {-68e-3 + add} -27e-3 end /*------------------------------------------------------------------------*/ //A table to calculate equilibrium potential of the Ca ion //E_Ca= -0.0133*log((Ca)/1.2) function make_ECa_comp if (({exists ECa_comp})) return end create table ECa_comp float xmin = 0.00005 float xmax = 0.01 int xdivs = 100 call ECa_comp TABCREATE {xdivs} {xmin} {xmax} int i float x, dx, eca dx = (xmax - xmin)/xdivs x = xmin for (i = 0; i <= (xdivs); i = i + 1) eca = {-0.0133 * {log {x/1.2 }} } setfield ECa_comp table->table[{i}] {eca} x = x + dx end setfield ECa_comp table->calc_mode 0 call ECa_comp TABFILL 3000 0 end /*----------------------------------------------------------------------*/ //This function copies the above object into every bits of the cell //and establishes connections. function setup_ECa_comp if ((!{exists /library/ECa_comp})) echo /library/ECa_comp can not be found. Terminating. return end str part foreach part ({el /prot_pyr/#}) if (!{exists {part}/Ca_concI} || !{exists {part}/Ca}) echo The calcium pool or calcium current is missing. Terminating. end copy /library/ECa_comp {part} addmsg {part}/Ca_concI {part}/ECa_comp INPUT Ca addmsg {part}/ECa_comp {part}/Ca EK output end end /*------------------------------------------------------------------------*/ //FIRST calcium concentration for E_Ca and K_C //d[Ca]/dt = [Ca]/tau - f/(w * z * F * A) * I_Ca //where tau = 9e-4 sec, w = 1e-6 m, z = 2 (valence of Ca++), //F = 96484.6 C/mol, A is the compartment area //f = 0.7 //From Jose Manuel Ibarz function make_Ca_concI if (({exists Ca_concI})) return end create Ca_concen Ca_concI setfield ^ tau 0.0009 B 3e-6 Ca_base 0.00005 thick 1e-6 if (!{exists Ca_concI sendmsg1}) addfield Ca_concI sendmsg1 end setfield Ca_concI sendmsg1 "../Ca . I_Ca Ik" end /*------------------------------------------------------------------------*/ //SECOUND calcium concentration for K_AHP //d[Ca]/dt = [Ca]/tau - f/(w * z * F * A) * I_Ca //where tau = 1 sec, w = 1e-6 m, z = 2 (valence of Ca++), //F = 96484.6 C/mol, A is the compartment area //f = 0.024 //There are rumors about tau being 2 sec //From Jose Manuel Ibarz function make_Ca_concII if (({exists Ca_concII})) return end create Ca_concen Ca_concII setfield ^ tau 1 B 3e-6 Ca_base 0.00005 thick 1e-6 if (!{exists Ca_concII sendmsg1}) addfield Ca_concII sendmsg1 end setfield Ca_concII sendmsg1 "../Ca . I_Ca Ik" end /*------------------------------------------------------------------------*/ //The K_AHP current //I_AHP = g_AHP * q * (Vm - E_K) //From Jose Manuel Ibarz function make_K_AHP if (({exists K_AHP})) return end create tabchannel K_AHP setfield ^ Ek {EK_PYR} Gbar {SOMA_A_PYR} Ik 0 Gk 0 Xpower 0 \ Ypower 0 Zpower 1 //q call K_AHP TABCREATE Z 30 0 0.003 settab2const K_AHP Z_A 0 30 0.048 // sets tau = 48 ms setfield K_AHP Z_B->table[0] 0 \ Z_B->table[1] 0.0044 Z_B->table[2] 0.0353 \ Z_B->table[3] 0.111 Z_B->table[4] 0.231 \ Z_B->table[5] 0.372 Z_B->table[6] 0.508 \ Z_B->table[7] 0.622 Z_B->table[8] 0.712 \ Z_B->table[9] 0.780 Z_B->table[10] 0.830 \ Z_B->table[11] 0.867 Z_B->table[12] 0.895 \ Z_B->table[13] 0.915 Z_B->table[14] 0.931 \ Z_B->table[15] 0.944 Z_B->table[16] 0.953 \ Z_B->table[17] 0.961 Z_B->table[18] 0.967 \ Z_B->table[19] 0.972 Z_B->table[20] 0.976 \ Z_B->table[21] 0.979 Z_B->table[22] 0.982 \ Z_B->table[23] 0.984 Z_B->table[24] 0.986 \ Z_B->table[25] 0.987 Z_B->table[26] 0.989 \ Z_B->table[27] 0.990 Z_B->table[28] 0.991 \ Z_B->table[29] 0.992 Z_B->table[30] 1.000 tweaktau K_AHP Z setfield K_AHP Z_A->calc_mode 0 Z_B->calc_mode 0 call K_AHP TABFILL Z 3000 0 if (!{exists K_AHP addmsg1}) addfield K_AHP addmsg1 end setfield K_AHP addmsg1 "../Ca_concII . CONCEN Ca" end /*------------------------------------------------------------------*/ //The CT type potassium current //I_CT = g_CT * c * d * (V_m - E_K) function make_K_C if (({exists K_C})) return end create tab2Dchannel K_C setfield ^ Ek {EK_PYR} Gbar 0.0 \ Xindex {VOLT_C1_INDEX} Xpower 2 \ Yindex {VOLT_INDEX} Ypower 1 \ Zpower 0 int xdivs = 100 int ydivs = {xdivs} float y, dy, x, dx, a, b, vshift float xmin, xmax, ymin, ymax int i, j xmin = -0.1; xmax = 0.05; ymin = 0.00005; ymax = 0.0030 dx = (xmax - xmin)/xdivs dy = (ymax - ymin)/ydivs x = xmin //c call K_C TABCREATE X {xdivs} {xmin} {xmax} \ {ydivs} {ymin} {ymax} for (i = 0; i <= xdivs; i = i + 1) y = ymin for (j = 0; j <= ydivs; j = j + 1) vshift = 40e-3 * {log {y/13.805e-3}} a = -7.7e3 * (x + vshift + 0.103) / \ ({exp {(x + vshift + 0.103) / (-12e-3)}} -1) setfield K_C X_A->table[{i}][{j}] {a} setfield K_C X_B->table[{i}][{j}] 909.09 // tau_c = 1.1ms y = y + dy end x = x + dx end //d xdivs = 3000 call K_C TABCREATE Y 0 0 0 \ {xdivs} {xmin} {xmax} dx = (xmax - xmin)/xdivs x = xmin for (i = 0; i <= (xdivs); i = i + 1) a = 1e3 / {exp {(x + 79e-3) / 10e-3} } b = 4e3 / ({exp {(x - 82e-3) / (-27e-3)}} + 1) setfield K_C Y_A->table[0][{i}] {a} setfield K_C Y_B->table[0][{i}] {a + b} x = x + dx end setfield K_C Y_A->calc_mode 0 Y_B->calc_mode 0 if (!{exists K_C addmsg1}) addfield K_C addmsg1 end setfield K_C addmsg1 "../Ca_concI . CONCEN1 Ca" end /*---------------------------------------------------------------------------*/ //The hyperpolarization-activated currents //From: //Jeffrey C. Magee: Dendritic Hyperpolarization-Activated Currents Modify the //Integrative Properties of Hippocampal CA1 Pyramidal Neurons. Journal of //Neuroscience 18: 7613-7624, 1998 //SOMATIC VARIANT function make_I_H_S if (({exists I_H_S})) return end create tabchannel I_H_S setfield ^ Ek 0.0 Gbar 1.0 Ik 0 Gk 0 Xpower 1 //h call I_H_S TABCREATE X 12 -0.14 -0.02 setfield I_H_S \ X_A->table[0] 0.017 \ X_A->table[1] 0.017 X_A->table[2] 0.020 \ X_A->table[3] 0.024 X_A->table[4] 0.030 \ X_A->table[5] 0.039 X_A->table[6] 0.047 \ X_A->table[7] 0.040 X_A->table[8] 0.020 \ X_A->table[9] 0.016 X_A->table[10] 0.011 \ X_A->table[11] 0.008 \ X_A->table[12] 0.008 setfield I_H_S \ X_B->table[0] 1.0 \ X_B->table[1] 1.0 X_B->table[2] 0.98 \ X_B->table[3] 0.96 X_B->table[4] 0.90 \ X_B->table[5] 0.72 X_B->table[6] 0.40 \ X_B->table[7] 0.15 X_B->table[8] 0.063 \ X_B->table[9] 0.04 X_B->table[10] 0.0 \ X_B->table[11] 0.0 \ X_B->table[12] 0.0 tweaktau I_H_S X setfield I_H_S X_A->calc_mode 0 X_B->calc_mode 0 call I_H_S TABFILL X 3000 0 end //DENDRITIC VARIANT function make_I_H_D if (({exists I_H_D})) return end create tabchannel I_H_D setfield ^ Ek 0.0 Gbar 1.0 Ik 0 Gk 0 Xpower 1 //h call I_H_D TABCREATE X 12 -0.14 -0.02 //For testing float mult=1 setfield I_H_D \ X_A->table[0] {0.017 * mult}\ X_A->table[1] {0.017 * mult} X_A->table[2] {0.020 * mult}\ X_A->table[3] {0.024 * mult} X_A->table[4] {0.030 * mult}\ X_A->table[5] {0.039 * mult} X_A->table[6] {0.047 * mult}\ X_A->table[7] {0.040 * mult} X_A->table[8] {0.020 * mult}\ X_A->table[9] {0.016 * mult} X_A->table[10] {0.011 * mult}\ X_A->table[11] {0.008 * mult} \ X_A->table[12] {0.008 * mult} setfield I_H_D \ X_B->table[0] 1.0 \ X_B->table[1] 1.0 X_B->table[2] 0.96 \ X_B->table[3] 0.68 X_B->table[4] 0.40 \ X_B->table[5] 0.16 X_B->table[6] 0.063 \ X_B->table[7] 0.04 X_B->table[8] 0.0 \ X_B->table[9] 0.00 X_B->table[10] 0.0 \ X_B->table[11] 0.0 \ X_B->table[12] 0.0 tweaktau I_H_D X setfield I_H_D X_A->calc_mode 0 X_B->calc_mode 0 call I_H_D TABFILL X 3000 0 end