From a9f0b2fa01dc88581cfefdd06b1baff58e89f9e2 Mon Sep 17 00:00:00 2001 From: thorstenhater <24411438+thorstenhater@users.noreply.github.com> Date: Wed, 24 Jun 2020 14:37:34 +0200 Subject: [PATCH] Allen catalogue (#1071) Add a new catalogue comprising optimised version of some of the mechanisms commonly used in models of the Allen Cell Types Database, eg http://celltypes.brain-map.org/mouse/experiment/electrophysiology/323535089. This made required extending modcc to some new NMODL features, as well as to expose some optimisations. In addition clean up the default catalogue by moving test mechanisms to their proper place in the unit tests. --- mechanisms/CMakeLists.txt | 82 +++++--- mechanisms/allen/CaDynamics.mod | 41 ++++ mechanisms/allen/Ca_HVA.mod | 58 ++++++ mechanisms/allen/Ca_LVA.mod | 54 ++++++ mechanisms/allen/Ih.mod | 50 +++++ mechanisms/allen/Im.mod | 58 ++++++ mechanisms/allen/Im_v2.mod | 54 ++++++ mechanisms/allen/K_P.mod | 69 +++++++ mechanisms/allen/K_T.mod | 52 +++++ mechanisms/allen/Kd.mod | 41 ++++ mechanisms/allen/Kv2like.mod | 69 +++++++ mechanisms/allen/Kv3_1.mod | 39 ++++ mechanisms/allen/NaTa.mod | 93 +++++++++ mechanisms/allen/NaTs.mod | 93 +++++++++ mechanisms/allen/NaV.mod | 182 ++++++++++++++++++ mechanisms/allen/Nap.mod | 75 ++++++++ mechanisms/allen/SK.mod | 55 ++++++ mechanisms/{mod => default}/exp2syn.mod | 0 mechanisms/{mod => default}/expsyn.mod | 0 mechanisms/default/hh.mod | 95 +++++++++ mechanisms/{mod => default}/kamt.mod | 0 mechanisms/{mod => default}/kdrmt.mod | 0 mechanisms/{mod => default}/nax.mod | 0 mechanisms/{mod => default}/nernst.mod | 0 mechanisms/{mod => default}/pas.mod | 0 ...e_default_catalogue => generate_catalogue} | 20 +- mechanisms/mod/hh.mod | 92 --------- modcc/expression.cpp | 1 + test/unit/CMakeLists.txt | 3 + {mechanisms => test/unit}/mod/test_ca.mod | 0 {mechanisms => test/unit}/mod/test_kin1.mod | 0 {mechanisms => test/unit}/mod/test_kinlva.mod | 0 test/unit/test_fvm_layout.cpp | 2 + test/unit/test_fvm_lowered.cpp | 2 + test/unit/unit_test_catalogue.cpp | 6 + 35 files changed, 1263 insertions(+), 123 deletions(-) create mode 100644 mechanisms/allen/CaDynamics.mod create mode 100644 mechanisms/allen/Ca_HVA.mod create mode 100644 mechanisms/allen/Ca_LVA.mod create mode 100644 mechanisms/allen/Ih.mod create mode 100644 mechanisms/allen/Im.mod create mode 100644 mechanisms/allen/Im_v2.mod create mode 100644 mechanisms/allen/K_P.mod create mode 100644 mechanisms/allen/K_T.mod create mode 100644 mechanisms/allen/Kd.mod create mode 100644 mechanisms/allen/Kv2like.mod create mode 100644 mechanisms/allen/Kv3_1.mod create mode 100644 mechanisms/allen/NaTa.mod create mode 100644 mechanisms/allen/NaTs.mod create mode 100644 mechanisms/allen/NaV.mod create mode 100644 mechanisms/allen/Nap.mod create mode 100644 mechanisms/allen/SK.mod rename mechanisms/{mod => default}/exp2syn.mod (100%) rename mechanisms/{mod => default}/expsyn.mod (100%) create mode 100644 mechanisms/default/hh.mod rename mechanisms/{mod => default}/kamt.mod (100%) rename mechanisms/{mod => default}/kdrmt.mod (100%) rename mechanisms/{mod => default}/nax.mod (100%) rename mechanisms/{mod => default}/nernst.mod (100%) rename mechanisms/{mod => default}/pas.mod (100%) rename mechanisms/{generate_default_catalogue => generate_catalogue} (87%) delete mode 100644 mechanisms/mod/hh.mod rename {mechanisms => test/unit}/mod/test_ca.mod (100%) rename {mechanisms => test/unit}/mod/test_kin1.mod (100%) rename {mechanisms => test/unit}/mod/test_kinlva.mod (100%) diff --git a/mechanisms/CMakeLists.txt b/mechanisms/CMakeLists.txt index 56fd7d91..a751dd25 100644 --- a/mechanisms/CMakeLists.txt +++ b/mechanisms/CMakeLists.txt @@ -1,12 +1,5 @@ include(BuildModules.cmake) -# The list of library-provided mechanisms used to populate the default catalogue: -set(mechanisms pas hh expsyn exp2syn nernst test_kin1 test_kinlva test_ca nax kdrmt kamt) - -set(mod_srcdir "${CMAKE_CURRENT_SOURCE_DIR}/mod") - -# Generate mechanism implementations. - set(mech_dir "${CMAKE_CURRENT_BINARY_DIR}/generated") file(MAKE_DIRECTORY "${mech_dir}") @@ -15,37 +8,78 @@ if(ARB_WITH_EXTERNAL_MODCC) set(external_modcc MODCC ${modcc}) endif() +add_custom_target(build_all_mods) + +set(mech_sources "") + +# ALLEN +set(allen_mechanisms CaDynamics Ca_HVA Ca_LVA Ih Im Im_v2 K_P K_T Kd Kv2like Kv3_1 NaTa NaTs NaV Nap SK) +set(allen_mod_srcdir "${CMAKE_CURRENT_SOURCE_DIR}/allen") + build_modules( - ${mechanisms} - SOURCE_DIR "${mod_srcdir}" + ${allen_mechanisms} + SOURCE_DIR "${allen_mod_srcdir}" DEST_DIR "${mech_dir}" ${external_modcc} MODCC_FLAGS -t cpu -t gpu ${ARB_MODCC_FLAGS} GENERATES .hpp _cpu.cpp _gpu.cpp _gpu.cu - TARGET build_all_mods + TARGET build_catalogue_allen_mods) + +set(allen_catalogue_source ${CMAKE_CURRENT_BINARY_DIR}/allen_catalogue.cpp) +set(allen_catalogue_options -A arbor -I ${mech_dir} -o ${allen_catalogue_source} -B multicore -C allen) +if(ARB_WITH_GPU) + list(APPEND allen_catalogue_options -B gpu) +endif() + +add_custom_command( + OUTPUT ${allen_catalogue_source} + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/generate_catalogue ${allen_catalogue_options} ${allen_mechanisms} + DEPENDS generate_catalogue ) -# Generate source for default mechanism catalogue. +add_custom_target(allen_catalogue_cpp_target DEPENDS ${allen_catalogue_source}) +add_dependencies(build_catalogue_allen_mods allen_catalogue_cpp_target) +add_dependencies(build_all_mods build_catalogue_allen_mods) + +list(APPEND mech_sources ${allen_catalogue_source}) +foreach(mech ${allen_mechanisms}) + list(APPEND mech_sources ${mech_dir}/${mech}_cpu.cpp) + if(ARB_WITH_GPU) + list(APPEND mech_sources ${mech_dir}/${mech}_gpu.cpp) + list(APPEND mech_sources ${mech_dir}/${mech}_gpu.cu) + endif() +endforeach() + +# DEFAULT +set(default_mechanisms exp2syn expsyn hh kamt kdrmt nax nernst pas) +set(default_mod_srcdir "${CMAKE_CURRENT_SOURCE_DIR}/default") + +build_modules( + ${default_mechanisms} + SOURCE_DIR "${default_mod_srcdir}" + DEST_DIR "${mech_dir}" + ${external_modcc} + MODCC_FLAGS -t cpu -t gpu ${ARB_MODCC_FLAGS} + GENERATES .hpp _cpu.cpp _gpu.cpp _gpu.cu + TARGET build_catalogue_default_mods) -set(catsrc ${CMAKE_CURRENT_BINARY_DIR}/default_catalogue.cpp) -set(default_catalogue_options -A arbor -I ${mech_dir} -o ${catsrc} -B multicore) +set(default_catalogue_source ${CMAKE_CURRENT_BINARY_DIR}/default_catalogue.cpp) +set(default_catalogue_options -A arbor -I ${mech_dir} -o ${default_catalogue_source} -B multicore -C default) if(ARB_WITH_GPU) list(APPEND default_catalogue_options -B gpu) endif() add_custom_command( - OUTPUT ${catsrc} - COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/generate_default_catalogue ${default_catalogue_options} ${mechanisms} - DEPENDS generate_default_catalogue -) - -add_custom_target(default_catalogue_cpp_target DEPENDS ${catsrc}) -add_dependencies(build_all_mods default_catalogue_cpp_target) + OUTPUT ${default_catalogue_source} + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/generate_catalogue ${default_catalogue_options} ${default_mechanisms} + DEPENDS generate_catalogue) -# Make libraries with the implementations of the mechanism kernels. +add_custom_target(default_catalogue_cpp_target DEPENDS ${default_catalogue_source}) +add_dependencies(build_catalogue_default_mods default_catalogue_cpp_target) +add_dependencies(build_all_mods build_catalogue_default_mods) -set(mech_sources ${catsrc}) -foreach(mech ${mechanisms}) +list(APPEND mech_sources ${default_catalogue_source}) +foreach(mech ${default_mechanisms}) list(APPEND mech_sources ${mech_dir}/${mech}_cpu.cpp) if(ARB_WITH_GPU) list(APPEND mech_sources ${mech_dir}/${mech}_gpu.cpp) @@ -53,8 +87,8 @@ foreach(mech ${mechanisms}) endif() endforeach() +# set(arbor_mechanism_sources ${mech_sources} PARENT_SCOPE) - if(ARB_WITH_CUDA_CLANG OR ARB_WITH_HIP_CLANG) set_source_files_properties(${arbor_mechanism_sources} PROPERTIES LANGUAGE CXX) endif() diff --git a/mechanisms/allen/CaDynamics.mod b/mechanisms/allen/CaDynamics.mod new file mode 100644 index 00000000..f39e3c58 --- /dev/null +++ b/mechanisms/allen/CaDynamics.mod @@ -0,0 +1,41 @@ +: Dynamics that track inside calcium concentration +: modified from Destexhe et al. 1994 + +NEURON { + SUFFIX CaDynamics + USEION ca READ ica WRITE cai + RANGE decay, gamma, minCai, depth + GLOBAL F +} + +UNITS { + (mV) = (millivolt) + (mA) = (milliamp) + (molar) = (1/liter) + (mM) = (millimolar) + (um) = (micron) +} + +PARAMETER { + F = 96485.3321233100184 (coulomb/mole) : Faraday's constant + gamma = 0.05 () : percent of free calcium (not buffered) + decay = 80 (ms) : rate of removal of calcium + depth = 0.1 (um) : depth of shell + minCai = 1e-4 (mM) +} + +INITIAL { + cai = minCai +} + +STATE { + cai (mM) +} + +BREAKPOINT { + SOLVE states METHOD cnexp +} + +DERIVATIVE states { + cai' = -10000*ica*gamma/(2*F*depth) - (cai - minCai)/decay +} diff --git a/mechanisms/allen/Ca_HVA.mod b/mechanisms/allen/Ca_HVA.mod new file mode 100644 index 00000000..de855c8a --- /dev/null +++ b/mechanisms/allen/Ca_HVA.mod @@ -0,0 +1,58 @@ +: Reference: Reuveni, Friedman, Amitai, and Gutnick, J.Neurosci. 1993 + +NEURON { + SUFFIX Ca_HVA + USEION ca READ eca WRITE ica + RANGE gbar +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + ica = gbar*m*m*h*(v-eca) +} + +DERIVATIVE states { + LOCAL mAlpha, mBeta, hAlpha, hBeta, mRat, hRat + + mAlpha = 0.055*vtrap(-27 - v, 3.8) + mBeta = 0.94*exp((-75-v)/17) + mRat = mAlpha + mBeta + + hAlpha = 0.000457*exp((-13-v)/50) + hBeta = 0.0065/(exp((-v-15)/28)+1) + hRat = hAlpha + hBeta + + m' = mAlpha - m*mRat + h' = hAlpha - h*hRat +} + +INITIAL { + LOCAL mAlpha, mBeta, hAlpha, hBeta + + mAlpha = 0.055*vtrap(-27 - v, 3.8) + mBeta = 0.94*exp((-75 - v)/17) + m = mAlpha/(mAlpha + mBeta) + + hAlpha = 0.000457*exp((-13-v)/50) + hBeta = 0.0065/(exp((-v-15)/28) + 1) + h = hAlpha/(hAlpha + hBeta) +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + vtrap = y*exprelr(x/y) +} diff --git a/mechanisms/allen/Ca_LVA.mod b/mechanisms/allen/Ca_LVA.mod new file mode 100644 index 00000000..0d35ebd3 --- /dev/null +++ b/mechanisms/allen/Ca_LVA.mod @@ -0,0 +1,54 @@ +: Comment: LVA ca channel. Note: mtau is an approximation from the plots +: Reference: Avery and Johnston 1996, tau from Randall 1997 +: Comment: shifted by -10 mv to correct for junction potential +: Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Ca_LVA + USEION ca READ eca WRITE ica + RANGE gbar +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + celsius +} + +ASSIGNED { + qt +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + ica = gbar*m*m*h*(v - eca) +} + +DERIVATIVE states { + LOCAL mInf, mRat, hInf, hRat + + mInf = 1/(1 + exp((v + 40)/-6)) + hInf = 1/(1 + exp((v + 90)/6.4)) + mRat = qt/(5 + 20/(1 + exp((v + 35)/5))) + hRat = qt/(20 + 50/(1 + exp((v + 50)/7))) + + m' = (mInf - m)*mRat + h' = (hInf - h)*hRat +} + +INITIAL { + qt = 2.3^((celsius-21)/10) + + m = 1/(1 + exp((v + 40)/-6)) + h = 1/(1 + exp((v + 90)/6.4)) +} diff --git a/mechanisms/allen/Ih.mod b/mechanisms/allen/Ih.mod new file mode 100644 index 00000000..e21b8e75 --- /dev/null +++ b/mechanisms/allen/Ih.mod @@ -0,0 +1,50 @@ +: Reference: Kole,Hallermann,and Stuart, J. Neurosci. 2006 + +NEURON { + SUFFIX Ih + NONSPECIFIC_CURRENT ihcn + RANGE gbar +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + ehcn = -45.0 (mV) +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + ihcn = gbar*m*(v-ehcn) +} + +DERIVATIVE states { + LOCAL mAlpha, mBeta, mRat + + mAlpha = 0.001*6.43*vtrap(v + 154.9, 11.9) + mBeta = 0.001*193*exp(v/33.1) + mRat = mAlpha + mBeta + + m' = mAlpha - m*mRat +} + +INITIAL { + LOCAL mAlpha, mBeta + + mAlpha = 0.001 * 6.43 * vtrap(v + 154.9, 11.9) + mBeta = 0.001*193*exp(v/33.1) + + m = mAlpha/(mAlpha + mBeta) +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + vtrap = y*exprelr(x/y) +} diff --git a/mechanisms/allen/Im.mod b/mechanisms/allen/Im.mod new file mode 100644 index 00000000..3ebe0d1a --- /dev/null +++ b/mechanisms/allen/Im.mod @@ -0,0 +1,58 @@ +: Reference: Adams et al. 1982 - M-currents and other potassium currents in bullfrog sympathetic neurones +: Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Im + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m + ik = g*(v-ek) +} + +DERIVATIVE states { + rates(v) + m' = (mInf-m)/mTau +} + +INITIAL{ + rates(v) + m = mInf +} + +PROCEDURE rates(v){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + mAlpha = 3.3e-3*exp(2.5*0.04*(v - -35)) + mBeta = 3.3e-3*exp(-2.5*0.04*(v - -35)) + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt +} diff --git a/mechanisms/allen/Im_v2.mod b/mechanisms/allen/Im_v2.mod new file mode 100644 index 00000000..cc8c872d --- /dev/null +++ b/mechanisms/allen/Im_v2.mod @@ -0,0 +1,54 @@ +: Based on Im model of Vervaeke et al. (2006) + +NEURON { + SUFFIX Im_v2 + USEION k READ ek WRITE ik + RANGE gbar, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + celsius (degC) + gbar = 0.00001 (S/cm2) +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + ik = gbar*m*(v - ek) +} + +DERIVATIVE states { + LOCAL qt, mAlpha, mBeta, mInf, mRat, iab + + qt = 2.3^((celsius - 30)/10) + + mAlpha = 0.007 * exp(( 6 * 0.4 * (v + 48))/26.12) + mBeta = 0.007 * exp((-6 * (1 - 0.4) * (v + 48))/26.12) + + iab = 1/(mAlpha + mBeta) + + mInf = mAlpha*iab + mRat = qt/(15 + iab) + + m' = (mInf - m)*mRat +} + +INITIAL { + LOCAL qt, mAlpha, mBeta + qt = 2.3^((celsius - 30)/10) + + mAlpha = 0.007*exp(( 6 * 0.4 * (v + 48))/26.12) + mBeta = 0.007*exp((-6 * (1 - 0.4) * (v + 48))/26.12) + + m = mAlpha/(mAlpha + mBeta) +} + diff --git a/mechanisms/allen/K_P.mod b/mechanisms/allen/K_P.mod new file mode 100644 index 00000000..0e20d5fd --- /dev/null +++ b/mechanisms/allen/K_P.mod @@ -0,0 +1,69 @@ +: Comment: The persistent component of the K current +: Reference: Voltage-gated K+ channels in layer 5 neocortical pyramidal neurones from young rats:subtypes and gradients,Korngreen and Sakmann, J. Physiology, 2000 + + +NEURON { + SUFFIX K_P + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) + tauF = 1 +} + +ASSIGNED { + v (mV) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*h + ik = g*(v-ek) +} + +DERIVATIVE states { + rates(v) + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates(v) + m = mInf + h = hInf +} + +PROCEDURE rates(v) { + LOCAL qt + qt = 2.3^((celsius-21)/10) + UNITSOFF + mInf = 1 / (1 + exp(-(v - (-14.3 + vshift)) / 14.6)) + if (v < -50 + vshift){ + mTau = tauF * (1.25+175.03*exp(-(v - vshift) * -0.026))/qt + } else { + mTau = tauF * (1.25+13*exp(-(v - vshift) * 0.026))/qt + } + hInf = 1/(1 + exp(-(v - (-54 + vshift))/-11)) + hTau = (360+(1010+24*(v - (-55 + vshift)))*exp(-((v - (-75 + vshift))/48)^2))/qt + UNITSON +} diff --git a/mechanisms/allen/K_T.mod b/mechanisms/allen/K_T.mod new file mode 100644 index 00000000..ca867d4f --- /dev/null +++ b/mechanisms/allen/K_T.mod @@ -0,0 +1,52 @@ +: Comment: The transient component of the K current +: Reference: Voltage-gated K+ channels in layer 5 neocortical pyramidal neurones from young rats:subtypes and gradients +: Korngreen and Sakmann, J. Physiology, 2000 + +NEURON { + SUFFIX K_T + USEION k READ ek WRITE ik + RANGE gbar +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) + mTauF = 1.0 + hTauF = 1.0 + celsius (degC) +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + ik = gbar*m*m*m*m*h*(v-ek) +} + +DERIVATIVE states { + LOCAL qt, mRat, hRat, hInf, mInf + + qt = 2.3^((celsius-21)/10) + + mInf = 1/(1 + exp(-(v + 47 - vshift)/29)) + hInf = 1/(1 + exp( (v + 66 - vshift)/10)) + mRat = qt/(0.34 + mTauF*0.92*exp(-((v + 71 - vshift)/59)^2)) + hRat = qt/(8 + hTauF*49 *exp(-((v + 73 - vshift)/23)^2)) + + m' = (mInf - m)*mRat + h' = (hInf - h)*hRat +} + +INITIAL{ + m = 1/(1 + exp(-(v + 47 - vshift)/29)) + h = 1/(1 + exp( (v + 66 - vshift)/10)) +} diff --git a/mechanisms/allen/Kd.mod b/mechanisms/allen/Kd.mod new file mode 100644 index 00000000..cc0221da --- /dev/null +++ b/mechanisms/allen/Kd.mod @@ -0,0 +1,41 @@ +: Based on Kd model of Foust et al. (2011) + +NEURON { + SUFFIX Kd + USEION k READ ek WRITE ik + RANGE gbar, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + ik = gbar*m*h*(v - ek) +} + +DERIVATIVE states { + LOCAL mInf, hInf + mInf = 1 - 1/(1 + exp((v + 43)/8)) + hInf = 1/(1 + exp((v + 67)/7.3)) + m' = (mInf - m) + h' = (hInf - h)/1500 +} + +INITIAL { + m = 1 - 1/(1 + exp((v + 43)/8)) + h = 1/(1 + exp((v + 67)/7.3)) +} + diff --git a/mechanisms/allen/Kv2like.mod b/mechanisms/allen/Kv2like.mod new file mode 100644 index 00000000..a95a4177 --- /dev/null +++ b/mechanisms/allen/Kv2like.mod @@ -0,0 +1,69 @@ +: Kv2-like channel +: Adapted from model implemented in Keren et al. 2005 +: Adjusted parameters to be similar to guangxitoxin-sensitive current in mouse CA1 pyramids from Liu and Bean 2014 + +NEURON { + SUFFIX Kv2like + USEION k READ ek WRITE ik + RANGE gbar +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + celsius (degC) + gbar = 0.00001 (S/cm2) +} + +STATE { + m + h1 + h2 +} + +BREAKPOINT { + SOLVE states METHOD cnexp + ik = 0.5*gbar*m*m*(h1 + h2)*(v - ek) +} + +DERIVATIVE states { + LOCAL qt, mAlpha, mBeta, hInf, h1Rat, h2Rat, mRat + qt = 2.3^((celsius-21)/10) + + mAlpha = 0.12*vtrap(43 - v, 11) + mBeta = 0.02*exp(-(v + 1.27) / 120) + mRat = 0.4*qt*(mAlpha + mBeta) + + hInf = 1/(1 + exp((v + 58) / 11)) + h1Rat = qt/( 360 + (1010 + 23.7*(v + 54))*exp(-((v + 75) / 48)^2)) + h2Rat = qt/(2350 + 1380*exp(-0.011*v) - 210*exp(-0.03*v)) + + if (h2Rat < 0) { + h2Rat = 1e-3 + } + + m' = 0.4*qt*mAlpha - m*mRat + h1' = (hInf - h1)*h1Rat + h2' = (hInf - h2)*h2Rat +} + +INITIAL { + LOCAL hInf, mAlpha, mBeta + + mAlpha = 0.12*vtrap(43 - v, 11) + mBeta = 0.02*exp(-(v + 1.27) / 120) + + hInf = 1/(1 + exp((v + 58) / 11)) + + m = mAlpha/(mAlpha + mBeta) + h1 = hInf + h2 = hInf +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + vtrap = y*exprelr(x/y) +} diff --git a/mechanisms/allen/Kv3_1.mod b/mechanisms/allen/Kv3_1.mod new file mode 100644 index 00000000..a3258e26 --- /dev/null +++ b/mechanisms/allen/Kv3_1.mod @@ -0,0 +1,39 @@ +: Comment: Kv3-like potassium current + +NEURON { + SUFFIX Kv3_1 + USEION k READ ek WRITE ik + RANGE gbar, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + ik = gbar*m*(v - ek) +} + +DERIVATIVE states { + LOCAL mInf, mRat + mInf = 1/(1 + exp(-(v - 18.700 - vshift)/9.700)) + mRat = 0.25*(1 + exp(-(v + 46.560 - vshift)/44.140)) + + m' = (mInf - m)*mRat +} + +INITIAL { + m = 1/(1 + exp(-(v - 18.700 - vshift)/9.700)) +} diff --git a/mechanisms/allen/NaTa.mod b/mechanisms/allen/NaTa.mod new file mode 100644 index 00000000..51b9a8ec --- /dev/null +++ b/mechanisms/allen/NaTa.mod @@ -0,0 +1,93 @@ +: Reference: Colbert and Pan 2002 + +NEURON { + SUFFIX NaTa + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + + malphaF = 0.182 + mbetaF = 0.124 + mvhalf = -48 (mV) + mk = 6 (mV) + + halphaF = 0.015 + hbetaF = 0.015 + hvhalf = -69 (mV) + hk = 6 (mV) +} + +ASSIGNED { + v (mV) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta + hInf + hTau + hAlpha + hBeta +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*m*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates(v) + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates(v) + m = mInf + h = hInf +} + +PROCEDURE rates(v){ + LOCAL qt + qt = 2.3^((celsius-23)/10) + + UNITSOFF + mAlpha = malphaF * vtrap(-(v - mvhalf), mk) + mBeta = mbetaF * vtrap((v - mvhalf), mk) + + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt + + hAlpha = halphaF * vtrap(v - hvhalf, hk) : ng - adjusted this to match actual Colbert & Pan values for soma model + hBeta = hbetaF * vtrap(-(v - hvhalf), hk) : ng - adjusted this to match actual Colbert & Pan values for soma model + + hInf = hAlpha/(hAlpha + hBeta) + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} diff --git a/mechanisms/allen/NaTs.mod b/mechanisms/allen/NaTs.mod new file mode 100644 index 00000000..0c868b9a --- /dev/null +++ b/mechanisms/allen/NaTs.mod @@ -0,0 +1,93 @@ +: Reference: Colbert and Pan 2002 + +NEURON { + SUFFIX NaTs + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + + malphaF = 0.182 + mbetaF = 0.124 + mvhalf = -40 (mV) + mk = 6 (mV) + + halphaF = 0.015 + hbetaF = 0.015 + hvhalf = -66 (mV) + hk = 6 (mV) +} + +ASSIGNED { + v (mV) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta + hInf + hTau + hAlpha + hBeta +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*m*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates(v) + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates(v) + m = mInf + h = hInf +} + +PROCEDURE rates(v){ + LOCAL qt + qt = 2.3^((celsius-23)/10) + + UNITSOFF + mAlpha = malphaF * vtrap(-(v - mvhalf), mk) + mBeta = mbetaF * vtrap((v - mvhalf), mk) + + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt + + hAlpha = halphaF * vtrap(v - hvhalf, hk) + hBeta = hbetaF * vtrap(-(v - hvhalf), hk) + + hInf = hAlpha/(hAlpha + hBeta) + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} diff --git a/mechanisms/allen/NaV.mod b/mechanisms/allen/NaV.mod new file mode 100644 index 00000000..c78f7e95 --- /dev/null +++ b/mechanisms/allen/NaV.mod @@ -0,0 +1,182 @@ +TITLE Mouse sodium current +: Kinetics of Carter et al. (2012) +: Based on 37 degC recordings from mouse hippocampal CA1 pyramids + +NEURON { + SUFFIX NaV + USEION na READ ena WRITE ina + RANGE gbar +} + +ASSIGNED { + qt +} + +UNITS { + (mV) = (millivolt) + (S) = (siemens) +} + +PARAMETER { + gbar = .015 (S/cm2) + celsius (degC) + + : kinetic parameters + Con = 0.01 (/ms) : closed -> inactivated transitions + Coff = 40 (/ms) : inactivated -> closed transitions + Oon = 8 (/ms) : open -> Ineg transition + Ooff = 0.05 (/ms) : Ineg -> open transition + alpha = 400 (/ms) + beta = 12 (/ms) + gamma = 250 (/ms) : opening + delta = 60 (/ms) : closing + + alfac = 2.51 + btfac = 5.32 + + : Vdep + x1 = 24 (mV) : Vdep of activation (alpha) + x2 = -24 (mV) : Vdep of deactivation (beta) +} + +STATE { + C1 FROM 0 TO 1 + C2 FROM 0 TO 1 + C3 FROM 0 TO 1 + C4 FROM 0 TO 1 + C5 FROM 0 TO 1 + I1 FROM 0 TO 1 + I2 FROM 0 TO 1 + I3 FROM 0 TO 1 + I4 FROM 0 TO 1 + I5 FROM 0 TO 1 + O FROM 0 TO 1 + I6 FROM 0 TO 1 +} + +BREAKPOINT { + SOLVE activation METHOD sparse + ina = gbar*O*(v - ena) +} + +INITIAL { + qt = 2.3^((celsius-37)/10) + SOLVE seqinitial +} + +KINETIC activation { + LOCAL f01, f02, f03, f04, f0O, f11, f12, f13, f14, fi1, fi2, fi3, fi4, fi5, fin, b01, b02, b03, b04, b0O, b11, b12, b13, b14, bi1, bi2, bi3, bi4, bi5, bin, ibtf + + ibtf = 1/btfac + + f04 = qt*alpha*exp(v/x1) + f03 = 2*f04 + f02 = 3*f04 + f01 = 4*f04 + f0O = qt*gamma + + f14 = alfac*f04 + f13 = 2*f14 + f12 = 3*f14 + f11 = 4*f14 + + fi1 = qt*Con + fi2 = fi1*alfac + fi3 = fi2*alfac + fi4 = fi3*alfac + fi5 = fi4*alfac + fin = qt*Oon + + b01 = qt*beta*exp(v/x2) + b02 = 2*b01 + b03 = 3*b01 + b04 = 4*b01 + b0O = qt*delta + + b11 = b01*ibtf + b12 = 2*b11 + b13 = 3*b11 + b14 = 4*b11 + + bi1 = qt*Coff + bi2 = bi1*ibtf + bi3 = bi2*ibtf + bi4 = bi3*ibtf + bi5 = bi4*ibtf + bin = qt*Ooff + + ~ C1 <-> C2 (f01, b01) + ~ C2 <-> C3 (f02, b02) + ~ C3 <-> C4 (f03, b03) + ~ C4 <-> C5 (f04, b04) + ~ C5 <-> O (f0O, b0O) + ~ O <-> I6 (fin, bin) + ~ I1 <-> I2 (f11, b11) + ~ I2 <-> I3 (f12, b12) + ~ I3 <-> I4 (f13, b13) + ~ I4 <-> I5 (f14, b14) + ~ I5 <-> I6 (f0O, b0O) + ~ C1 <-> I1 (fi1, bi1) + ~ C2 <-> I2 (fi2, bi2) + ~ C3 <-> I3 (fi3, bi3) + ~ C4 <-> I4 (fi4, bi4) + ~ C5 <-> I5 (fi5, bi5) + + CONSERVE C1 + C2 + C3 + C4 + C5 + O + I1 + I2 + I3 + I4 + I5 + I6 = 1 +} + +: sets initial equilibrium +LINEAR seqinitial { + LOCAL f01, f02, f03, f04, f11, f12, f13, f14, f0O, fi1, fi2, fi3, fi4, fi5, fin, b01, b02, b03, b04, b11, b12, b13, b14, b0O, bi1, bi2, bi3, bi4, bi5, bin, ibtf + + ibtf = 1/btfac + f04 = qt*alpha*exp(v/x1) + f03 = 2*f04 + f02 = 3*f04 + f01 = 4*f04 + f0O = qt*gamma + + f14 = alfac*f04 + f13 = 2*f14 + f12 = 3*f14 + f11 = 4*f14 + + fi1 = qt*Con + fi2 = fi1*alfac + fi3 = fi2*alfac + fi4 = fi3*alfac + fi5 = fi4*alfac + fin = qt*Oon + + b01 = qt*beta*exp(v/x2) + b02 = 2*b01 + b03 = 3*b01 + b04 = 4*b01 + b0O = qt*delta + + b11 = b01*ibtf + b12 = 2*b11 + b13 = 3*b11 + b14 = 4*b11 + + bi1 = qt*Coff + bi2 = bi1*ibtf + bi3 = bi2*ibtf + bi4 = bi3*ibtf + bi5 = bi4*ibtf + bin = qt*Ooff + + ~ I1*bi1 + C2*b01 - C1*( fi1 + f01) = 0 + ~ C1*f01 + I2*bi2 + C3*b02 - C2*(b01 + fi2 + f02) = 0 + ~ C2*f02 + I3*bi3 + C4*b03 - C3*(b02 + fi3 + f03) = 0 + ~ C3*f03 + I4*bi4 + C5*b04 - C4*(b03 + fi4 + f04) = 0 + ~ C4*f04 + I5*bi5 + O*b0O - C5*(b04 + fi5 + f0O) = 0 + ~ C5*f0O + I6*bin - O*(b0O + fin) = 0 + ~ C1*fi1 + I2*b11 - I1*( bi1 + f11) = 0 + ~ I1*f11 + C2*fi2 + I3*b12 - I2*(b11 + bi2 + f12) = 0 + ~ I2*f12 + C3*fi3 + I4*bi3 - I3*(b12 + bi3 + f13) = 0 + ~ I3*f13 + C4*fi4 + I5*b14 - I4*(b13 + bi4 + f14) = 0 + ~ I4*f14 + C5*fi5 + I6*b0O - I5*(b14 + bi5 + f0O) = 0 + + ~ C1 + C2 + C3 + C4 + C5 + O + I1 + I2 + I3 + I4 + I5 + I6 = 1 +} diff --git a/mechanisms/allen/Nap.mod b/mechanisms/allen/Nap.mod new file mode 100644 index 00000000..5eac9d53 --- /dev/null +++ b/mechanisms/allen/Nap.mod @@ -0,0 +1,75 @@ +:Reference : Modeled according to kinetics derived from Magistretti & Alonso 1999 +:Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Nap + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + g (S/cm2) + celsius (degC) + mInf + hInf + hTau + hAlpha + hBeta +} + +STATE { + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + rates(v) + g = gbar*mInf*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates(v) + h' = (hInf-h)/hTau +} + +INITIAL{ + rates(v) + h = hInf +} + +PROCEDURE rates(v){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + mInf = 1.0/(1+exp((v- -52.6)/-4.6)) : assuming instantaneous activation as modeled by Magistretti and Alonso + + hInf = 1.0/(1+exp((v- -48.8)/10)) + hAlpha = 2.88e-6 * vtrap(v + 17, 4.63) + hBeta = 6.94e-6 * vtrap(-(v + 64.4), 2.63) + + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} diff --git a/mechanisms/allen/SK.mod b/mechanisms/allen/SK.mod new file mode 100644 index 00000000..d30c57e1 --- /dev/null +++ b/mechanisms/allen/SK.mod @@ -0,0 +1,55 @@ +: SK-type calcium-activated potassium current +: Reference : Kohler et al. 1996 + +NEURON { + SUFFIX SK + USEION k READ ek WRITE ik + USEION ca READ cai + RANGE gbar, ik +} + +UNITS { + (mV) = (millivolt) + (mA) = (milliamp) + (mM) = (milli/liter) +} + +PARAMETER { + gbar = .000001 (mho/cm2) + zTau = 1 (ms) +} + +ASSIGNED { + zInf + g (S/cm2) +} + +STATE { + z FROM 0 TO 1 +} + +BREAKPOINT { + SOLVE states METHOD cnexp + ik = gbar*z*(v - ek) +} + +DERIVATIVE states { + LOCAL l_ca + l_ca = cai + if(l_ca < 1e-7){ + l_ca = l_ca + 1e-07 + } + zInf = 1/(1 + (0.00043 / l_ca)^4.8) + + z' = (zInf - z) / zTau +} + +INITIAL { + LOCAL l_ca + l_ca = cai + if(l_ca < 1e-7) { + l_ca = l_ca + 1e-07 + } + + z = 1/(1 + (0.00043 / l_ca)^4.8) +} diff --git a/mechanisms/mod/exp2syn.mod b/mechanisms/default/exp2syn.mod similarity index 100% rename from mechanisms/mod/exp2syn.mod rename to mechanisms/default/exp2syn.mod diff --git a/mechanisms/mod/expsyn.mod b/mechanisms/default/expsyn.mod similarity index 100% rename from mechanisms/mod/expsyn.mod rename to mechanisms/default/expsyn.mod diff --git a/mechanisms/default/hh.mod b/mechanisms/default/hh.mod new file mode 100644 index 00000000..aa73539d --- /dev/null +++ b/mechanisms/default/hh.mod @@ -0,0 +1,95 @@ +NEURON { + SUFFIX hh + USEION na READ ena WRITE ina + USEION k READ ek WRITE ik + NONSPECIFIC_CURRENT il + RANGE gnabar, gkbar, gl, el, gna, gk + GLOBAL minf, hinf, ninf, mtau, htau, ntau +} + +UNITS { + (mV) = (millivolt) + (S) = (siemens) +} + +PARAMETER { + gnabar = .12 (S/cm2) + gkbar = .036 (S/cm2) + gl = .0003 (S/cm2) + el = -54.3 (mV) + celsius (degC) +} + +STATE { + m h n +} + +ASSIGNED { + v (mV) + + gna (S/cm2) + gk (S/cm2) + minf + hinf + ninf + mtau (ms) + htau (ms) + ntau (ms) + q10 +} + +BREAKPOINT { + SOLVE states METHOD cnexp + gna = gnabar*m*m*m*h + ina = gna*(v - ena) + gk = gkbar*n*n*n*n + ik = gk*(v - ek) + il = gl*(v - el) +} + +INITIAL { + q10 = 3^((celsius - 6.3)/10) + rates(v) + m = minf + h = hinf + n = ninf +} + +DERIVATIVE states { + rates(v) + m' = (minf-m)/mtau + h' = (hinf-h)/htau + n' = (ninf-n)/ntau +} + +PROCEDURE rates(v) +{ + LOCAL alpha, beta, sum + + :"m" sodium activation system + alpha = .1 * vtrap(-(v+40),10) + beta = 4 * exp(-(v+65)/18) + sum = alpha + beta + mtau = 1/(q10*sum) + minf = alpha/sum + + :"h" sodium inactivation system + alpha = .07 * exp(-(v+65)/20) + beta = 1 / (exp(-(v+35)/10) + 1) + sum = alpha + beta + htau = 1/(q10*sum) + hinf = alpha/sum + + :"n" potassium activation system + alpha = .01*vtrap(-(v+55),10) + beta = .125*exp(-(v+65)/80) + sum = alpha + beta + ntau = 1/(q10*sum) + ninf = alpha/sum +} + +FUNCTION vtrap(x,y) { + : use built in exprelr(z) = z/(exp(z)-1), which handles the z=0 case correctly + vtrap = y*exprelr(x/y) +} + diff --git a/mechanisms/mod/kamt.mod b/mechanisms/default/kamt.mod similarity index 100% rename from mechanisms/mod/kamt.mod rename to mechanisms/default/kamt.mod diff --git a/mechanisms/mod/kdrmt.mod b/mechanisms/default/kdrmt.mod similarity index 100% rename from mechanisms/mod/kdrmt.mod rename to mechanisms/default/kdrmt.mod diff --git a/mechanisms/mod/nax.mod b/mechanisms/default/nax.mod similarity index 100% rename from mechanisms/mod/nax.mod rename to mechanisms/default/nax.mod diff --git a/mechanisms/mod/nernst.mod b/mechanisms/default/nernst.mod similarity index 100% rename from mechanisms/mod/nernst.mod rename to mechanisms/default/nernst.mod diff --git a/mechanisms/mod/pas.mod b/mechanisms/default/pas.mod similarity index 100% rename from mechanisms/mod/pas.mod rename to mechanisms/default/pas.mod diff --git a/mechanisms/generate_default_catalogue b/mechanisms/generate_catalogue similarity index 87% rename from mechanisms/generate_default_catalogue rename to mechanisms/generate_catalogue index 31bc974d..fe821756 100755 --- a/mechanisms/generate_default_catalogue +++ b/mechanisms/generate_catalogue @@ -62,6 +62,12 @@ def parse_arguments(): metavar = 'BACKEND', help = 'register implementations for back-end %(metavar)s') + group.add_argument( + '-C', '--catalogue', + default = 'default', + dest = 'catalogue', + help = 'catalogue name, default "%(default)s"') + group.add_argument( '-o', '--output', default = [], @@ -77,7 +83,7 @@ def parse_arguments(): return vars(parser.parse_args()) -def generate(modpfx='', arbpfx='', modules=[], backends=[], **rest): +def generate(catalogue, modpfx='', arbpfx='', modules=[], backends=[], **rest): src = string.Template(\ r'''// Automatically generated by: // $cmdline @@ -88,7 +94,7 @@ $module_includes namespace arb { -mechanism_catalogue build_default_catalogue() { +mechanism_catalogue build_${catalogue}_catalogue() { mechanism_catalogue cat; $add_modules @@ -96,8 +102,8 @@ mechanism_catalogue build_default_catalogue() { return cat; } -const mechanism_catalogue& global_default_catalogue() { - static mechanism_catalogue cat = build_default_catalogue(); +const mechanism_catalogue& global_${catalogue}_catalogue() { + static mechanism_catalogue cat = build_${catalogue}_catalogue(); return cat; } @@ -110,8 +116,9 @@ const mechanism_catalogue& global_default_catalogue() { # headers are resolved. return src.safe_substitute(dict( - cmdline = " ".join(sys.argv), - arbpfx = arbpfx, + cmdline=" ".join(sys.argv), + arbpfx=arbpfx, + catalogue=catalogue, backend_includes = indent(0, # ['#include <{}backends/{}/fvm.hpp>'.format(arbpfx, b) for b in backends]), ['#include "backends/{}/fvm.hpp"'.format(b) for b in backends]), @@ -131,4 +138,3 @@ if args['output']: print(code, file = open(args['output'],'w')) else: print(code) - diff --git a/mechanisms/mod/hh.mod b/mechanisms/mod/hh.mod deleted file mode 100644 index a27c8439..00000000 --- a/mechanisms/mod/hh.mod +++ /dev/null @@ -1,92 +0,0 @@ -NEURON { - SUFFIX hh - USEION na READ ena WRITE ina - USEION k READ ek WRITE ik - NONSPECIFIC_CURRENT il - RANGE gnabar, gkbar, gl, el -} - -UNITS { - (mV) = (millivolt) - (S) = (siemens) -} - -PARAMETER { - gnabar = .12 (S/cm2) - gkbar = .036 (S/cm2) - gl = .0003 (S/cm2) - el = -54.3 (mV) - celsius -} - -STATE { - m h n -} - -ASSIGNED { - v (mV) - q10 -} - -BREAKPOINT { - SOLVE states METHOD cnexp - LOCAL gna, gk, n2, n_, m_ - n_ = n - n2 = n_*n_ - m_ = m - gna = gnabar*m_*m_*m_*h - ina = gna*(v - ena) - gk = gkbar*n2*n2 - ik = gk*(v - ek) - il = gl*(v - el) -} - -INITIAL { - q10 = 3^((celsius - 6.3)*0.1) - - LOCAL alpha, beta - - :"m" sodium activation system - alpha = exprelr(-(v+40)*0.1) - beta = 4 * exp(-(v+65)*0.05555555555555555) - m = alpha/(alpha + beta) - - :"h" sodium inactivation system - alpha = .07 * exp(-(v+65)*0.05) - beta = 1 / (exp(-(v+35)*0.1) + 1) - h = alpha/(alpha + beta) - - :"n" potassium activation system - alpha = .1*exprelr(-(v+55)*0.1) - beta = .125*exp(-(v+65)*0.0125) - n = alpha/(alpha + beta) -} - -DERIVATIVE states { - LOCAL alpha, beta, sum, minf, ninf, hinf, mrate, nrate, hrate - - :"m" sodium activation system - alpha = exprelr(-(v+40)*0.1) - beta = 4 * exp(-(v+65)*0.05555555555555555) - sum = alpha + beta - mrate = q10*sum - minf = alpha/sum - - :"h" sodium inactivation system - alpha = .07 * exp(-(v+65)*0.05) - beta = 1 / (exp(-(v+35)*0.1) + 1) - sum = alpha + beta - hrate = q10*sum - hinf = alpha/sum - - :"n" potassium activation system - alpha = .1*exprelr(-(v+55)*0.1) - beta = .125*exp(-(v+65)*0.0125) - sum = alpha + beta - nrate = q10*sum - ninf = alpha/sum - - m' = (minf-m)*mrate - h' = (hinf-h)*hrate - n' = (ninf-n)*nrate -} diff --git a/modcc/expression.cpp b/modcc/expression.cpp index 336acf91..51073654 100644 --- a/modcc/expression.cpp +++ b/modcc/expression.cpp @@ -609,6 +609,7 @@ void ProcedureExpression::semantic(scope_type::symbol_map &global_symbols) { switch (kind_) { case procedureKind::derivative: case procedureKind::kinetic: + case procedureKind::linear: case procedureKind::initial: case procedureKind::breakpoint: scp->in_api_context(true); diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index f914964a..966ff9fd 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -30,6 +30,9 @@ set(test_mechanisms write_eX read_cai_init write_cai_breakpoint + test_ca + test_kin1 + test_kinlva ) include(${PROJECT_SOURCE_DIR}/mechanisms/BuildModules.cmake) diff --git a/mechanisms/mod/test_ca.mod b/test/unit/mod/test_ca.mod similarity index 100% rename from mechanisms/mod/test_ca.mod rename to test/unit/mod/test_ca.mod diff --git a/mechanisms/mod/test_kin1.mod b/test/unit/mod/test_kin1.mod similarity index 100% rename from mechanisms/mod/test_kin1.mod rename to test/unit/mod/test_kin1.mod diff --git a/mechanisms/mod/test_kinlva.mod b/test/unit/mod/test_kinlva.mod similarity index 100% rename from mechanisms/mod/test_kinlva.mod rename to test/unit/mod/test_kinlva.mod diff --git a/test/unit/test_fvm_layout.cpp b/test/unit/test_fvm_layout.cpp index 68314cc3..4d4be869 100644 --- a/test/unit/test_fvm_layout.cpp +++ b/test/unit/test_fvm_layout.cpp @@ -732,7 +732,9 @@ TEST(fvm_layout, ion_weights) { {0.}, {0., 1./2, 0.}, {1./4, 0., 0.}, {0., 0., 0., 0., 0.}, {3./4, 0.} }; + mechanism_catalogue testcat = make_unit_test_catalogue(); cable_cell_global_properties gprop; + gprop.catalogue = &testcat; gprop.default_parameters = neuron_parameter_defaults; fvm_value_type cai = gprop.default_parameters.ion_data["ca"].init_int_concentration; diff --git a/test/unit/test_fvm_lowered.cpp b/test/unit/test_fvm_lowered.cpp index 62294e57..09cfe347 100644 --- a/test/unit/test_fvm_lowered.cpp +++ b/test/unit/test_fvm_lowered.cpp @@ -447,6 +447,7 @@ TEST(fvm_lowered, derived_mechs) { } cable1d_recipe rec(cells); + rec.catalogue() = make_unit_test_catalogue(); rec.catalogue().derive("custom_kin1", "test_kin1", {{"tau", 20.0}}); cable_probe_total_ion_current_density where{mlocation{1, 0.3}}; @@ -806,6 +807,7 @@ TEST(fvm_lowered, weighted_write_ion) { c.paint(reg::branch(3), "test_ca"); cable1d_recipe rec(c); + rec.catalogue() = make_unit_test_catalogue(); rec.add_ion("ca", 2, con_int, con_ext, 0.0); std::vector<target_handle> targets; diff --git a/test/unit/unit_test_catalogue.cpp b/test/unit/unit_test_catalogue.cpp index aeb7f39d..2c223986 100644 --- a/test/unit/unit_test_catalogue.cpp +++ b/test/unit/unit_test_catalogue.cpp @@ -36,6 +36,9 @@ #include "mechanisms/write_eX.hpp" #include "mechanisms/read_cai_init.hpp" #include "mechanisms/write_cai_breakpoint.hpp" +#include "mechanisms/test_ca.hpp" +#include "mechanisms/test_kin1.hpp" +#include "mechanisms/test_kinlva.hpp" #include "../gtest.h" @@ -55,6 +58,9 @@ using namespace arb; mechanism_catalogue make_unit_test_catalogue(const mechanism_catalogue& from) { mechanism_catalogue cat(from); + ADD_MECH(cat, test_ca) + ADD_MECH(cat, test_kin1) + ADD_MECH(cat, test_kinlva) ADD_MECH(cat, ca_linear) ADD_MECH(cat, celsius_test) ADD_MECH(cat, diam_test) -- GitLab