/*
* MANDATORY command-line args:
*
* NB: All conductance density arguments must be supplied in pS/um^2 units;
* they will be subsequently converted to mho/cm^2 as expected in the O-LM
* code. This is for readability purposes and shortening the filenames for
* the model outputs.
*
* Nad, Nas, Kdrf, Kdrs, KA, h, CaL, CaT, AHP, M
* Maximal conductance densities for these channels (suffix "d" indicates
* dendrite, "s" soma). Axonal compartments get same value as dendrites.
* cf. Table A2, Lawrence et al. 2006; NB that axonal conductance density
* for gNa is the same as in dendrites; also recall that the axonal initial
* segment is attached to dendrites in O-LM cells (Martina et al. 2000).
*
* cinj
* Injected current into soma. Must be in pA units, which will subsequently
* be converted to nA as used in NEURON.
*
* hD
* Specifies whether the value provided by the h argument should be applied
* to the dendrites or not. If 0, h will only be assigned to somatic
* compartments; if 1, it will be assigned uniformly throughout the entire
* somato-dendritic domain.
*
* OPTIONAL command-line args:
*
* verbose
* Enables extra logging to stdout, particularly displaying what gbar
* values are being set for each conductance in each section.
*
* Ref for command-line arg processing in NEURON:
* https://www.neuron.yale.edu/phpBB/viewtopic.php?f=28&t=1747
*
* Remember that gkhbar has been commented out as it is being set directly in the mod file.
*/
func set_gbars() {
quitflag = 0
if (name_declared("Nad")!=5) { printf("ERROR: no Nad!\n") quitflag=1 }
if (name_declared("Nas")!=5) { printf("ERROR: no Nas!\n") quitflag=1 }
if (name_declared("Kdrf")!=5) { printf("ERROR: no Kdrf!\n") quitflag=1 }
if (name_declared("Kdrs")!=5) { printf("ERROR: no Kdrs!\n") quitflag=1 }
if (name_declared("KA")!=5) { printf("ERROR: no KA!\n") quitflag=1 }
if (name_declared("h")!=5) { printf("ERROR: no h!\n") quitflag=1 }
if (name_declared("hD")!=5) { printf("ERROR: no hD!\n") quitflag=1 }
if (name_declared("CaL")!=5) { printf("ERROR: no CaL!\n") quitflag=1 }
if (name_declared("CaT")!=5) { printf("ERROR: no CaT!\n") quitflag=1 }
if (name_declared("AHP")!=5) { printf("ERROR: no AHP!\n") quitflag=1 }
if (name_declared("M")!=5) { printf("ERROR: no M!\n") quitflag=1 }
if (quitflag) {
return quitflag
}
// Convert from pS/um^2 given on command-line to mho/cm^2 expected by the model code.
Nad = Nad * 10^-4
Nas = Nas * 10^-4
Kdrf = Kdrf * 10^-4
Kdrs = Kdrs * 10^-4
KA = KA * 10^-4
h = h * 10^-4
CaL = CaL * 10^-4
CaT = CaT * 10^-4
AHP = AHP * 10^-4
M = M * 10^-4
if (VERBOSE) { printf("*** I have Nad |%g| Nas |%g| Kdrf |%g| Kdrs |%g| KA |%g| h |%g| hD |%g| CaL |%g| CaT |%g| AHP |%g| M |%g| ***\n", Nad, Nas, Kdrf, Kdrs, KA, h, hD, CaL, CaT, AHP, M) }
soma[0] distance() //sets soma[0](0) as origin
forsec all {
// Somatic compartments
if (issection("soma.*")) {
gbar_Ikdrf = Kdrf
gbar_Ikdrs = Kdrs
gbar_Ika = KA
gna_Nasoma = Nas
gkhbar_Ih = h
gbar_IM = M
if (VERBOSE) {
printf("** %s :\n", secname())
printf("\tgna_Nasoma = %g\n", gna_Nasoma)
printf("\tgbar_Ikdrf = %g\n", gbar_Ikdrf)
printf("\tgbar_Ikdrs = %g\n", gbar_Ikdrs)
printf("\tgbar_Ika = %g\n", gbar_Ika)
printf("\tgkhbar_Ih = %g\n", gkhbar_Ih)
printf("\tgbar_IM = %g\n", gbar_IM)
}
}
// Dendritic compartments
if (issection("dend.*")) {
gbar_Ikdrf = Kdrf
gbar_Ikdrs = Kdrs
gbar_Ika = KA
gna_Nadend = Nad
gcalbar_cal = CaL
gbar_cat = CaT
gkbar_kca = AHP
gbar_IM = M
if (hD == 1) {
gkhbar_Ih = h
//for (x, 0) gkhbar_Ih = 0.000005
}
if (VERBOSE) {
printf("** %s :\n", secname())
printf("\tgna_Nadend = %g\n", gna_Nadend)
printf("\tgbar_Ikdrf = %g\n", gbar_Ikdrf)
printf("\tgbar_Ikdrs = %g\n", gbar_Ikdrs)
printf("\tgbar_Ika = %g\n", gbar_Ika)
if (hD == 1) {
//printf("\tgkhbar_Ih = %g\n", gkhbar_Ih)
}
printf("\tgcalbar_cal = %g\n", gcalbar_cal)
printf("\tgbar_cat = %g\n", gbar_cat)
printf("\tgkbar_kca = %g\n", gkbar_kca)
printf("\tgbar_IM = %g\n", gbar_IM)
}
}
// Axonal compartments
if (issection("axon.*")) {
gbar_Ikdrfaxon = Kdrf
gbar_Ikdrsaxon = Kdrs
if (cell == 1) {
gna_Naaxon = Nad // for some reason Richy uses Naaxon...
} else {
gna_Nadend = Nad // ...but Starfish uses Nadend. Historical reasons from Lawrence et al (2006)?
}
if (VERBOSE) {
printf("** %s :\n", secname())
if (cell == 1) {
printf("\tgna_Naaxon = %g\n", gna_Naaxon)
} else {
printf("\tgna_Nadend = %g\n", gna_Nadend)
}
printf("\tgbar_Ikdrfaxon = %g\n", gbar_Ikdrfaxon)
printf("\tgbar_Ikdrsaxon = %g\n", gbar_Ikdrsaxon)
}
}
}
return 0 // success
}
/*
* NB: the "iprotocol.hoc" file must have been included first to call this.
*/
func set_cinj() {
if (name_declared("cinj")!=5) { printf("ERROR: no cinj!\n") return 1 }
injclamp.amp = cinj/1000
if (VERBOSE) { printf("*** injclamp.amp set to %g nA from arg of %g pA\n", injclamp.amp, cinj) }
return 0
}