NMODL语法UNITS(mV)=(millivolt)(mA)=(milliamp)(S)=(siemens)DESCRIPTIONNEURON{SUFFIX...RANGE...GLOBAL...NONSPECIFIC_CURRENT...USEION...READ...WRITE...VALENCErealPOINT_PROCESS...POINTER...EXTERNAL...}SuffixDESCRIPTIONThesuffix(后缀),_name能够附加在所有的变量,函数,和程序里。如果SUFFIX声明是缺省的,则以文件名作为后缀(以一个下划线字符作为添加)。如果有一个POINT_PROCESS声明,则这声明作为后缀。后缀能够防止名字的重载。在将来的某个时候我可能添加类似于访问声明的东西,对于特定机制它将允许省略后缀。注意这个后缀本身没有在模型描述文件里使用。如果后缀名是nothing,则对于变量函数程序没有明确的后缀声明在mod文件中。然后,这机制的名字将会是基本文件名。这是有用的如果你知道没有冲突的名字存在或者mod文件首先用来创建可随时偿还的函数,并且你想要准确地指定函数名。RangeDESCRIPTION这些名字将成为范围变量。不要在这里加后缀。这些名字也应该在NEURON模块外部的标准的PARAMETERorASSIGNED声明中出现。Parameters不能出现在一个NEURONRANGE声明中将会变成全局变量。Assigned变量不能出现在这个声明中或者是NEURONGLOBAL声明中将会隐藏起来。当一个机制插入一个部分,这些范围变量的值在NEURON模块外部的标准PARAMETER声明中设置为指定的值。GlobalDESCRIPTION这些名字应该在别处声明为ASSIGNEDorPARAMETERvariables,成为全局变量而不是局部变量。注意这里默认对PARAMETERvariable变成全局变量然而默认对一个ASSIGNEDvariable隐藏在用户层里。Nonspecific_CurrentDESCRIPTION这表示我们计算添加到总的膜电流的局部电流不会有助于任意的离子浓度。这个电流在任意SOLVE声明后但是在BREAKPOINT模块前应该被指定一个值。这个名字将会被隐藏在用户层除非它出现在一个里。UseionDESCRIPTION这个声明一个特异性离子种类将会用在模型里。这个内置的HH通道使用了na和k离子。不同模型处理相同的离子种类应该使用相同的名字以便所有的浓度和电流能够一致地计算。Na离子和na离子不一样。这个使用钙离子的例子模型称之为ca。如果一个离子声明了,假设为ion,那么一个单独的机制会在NEURON内部创建,表示为ion,不管“using”机制什么时候被插入,ion都将自动地插入。这个称为ion的机制变量由这离子携带的向外的总电流,iion;这个离子内部和外部浓度,ioni和iono;和这个离子的反转电位,eion。这些离子范围变量没有后缀。在9/94之前这个反转电位不会自动地从Nernstequation计算,但如果使用了这个就不得不被用户设置或者在一些机制中被分配。离子浓度和反转电位的用法已经变得更自然而然地反映它们的生理学含义剩下的就是合理有效的计算。这个新方法管理了反转电位和浓度关于GUI处理的行为(无论它们出现在PARAMETER,ASSIGNED,orSTATE面板中;甚至它们出现在这所有这些面板中)以及什么时候这反转电位自动地使用Nernst方程从浓度计算。这个决定关于使用什么类型发生在一个每部分基础并且被嵌入在部分里的机制设置所决定。这个规则是通过引用函数ion_style()定义的。三种情况值得注意。Read假设只有一个模型插入这一部分。USEIONcaREADeca然后eca将被作为一个PARAMETER来看待,cai/cao将不会出现在有gui创建的参数面板。现在插入另一个模型在相同的部分有USEIONcaREADcai,cao然后1)eca将会被“升为”一个ASSIGNEDvariable,2)cai/cao将会被作为一个不变的PARAMETER's,和3)eca将会被Nernstequation计算当finitialize()iscalled.Write最后,插入一个最终模型在相同位置USEIONcaWRITEcai,cao然后eca将仍然被看做一个ASSIGNEDvariable但将不仅仅被finitialize而且在每一个调用fadvance()。同样cai/cao将会被初始化为全局变cai0_ca_ionandcao0_ca_ion分别地and看做STATE'sbythegraphicalinterface.这对于系统的想法使得自动选择一种类型,它是明显的依靠反转电位在浓度和剩余效果方面。由于这个nernstequation现在自动的需要使用化合价(通过离子携带电荷)除了优先的离子:na,k,ca有化合价1,1,2.只有这离子名字na,k,和ca会初始化到一个生理学意义的值。浓度和反转电位应该是经过考虑的参数除非明确的通过一些机制计算得到。Valence一个USEION的READ列表指定的那些离子变量被用来计算其它值而不是计算它本身。WRITE列表指定的那些离子变量被用来在机制里计算。通常地,一个通道将会读出浓度或反转电位变量或者写一个电流。一个计算浓度的机制将正常的读一个电流或者写细胞内的和/或细胞外的。一个大的钙模型会写所有的离子变量(包括电流)和读离子电流。如果有超过一个机制在相同位置试着写相同的浓度可能会发生错误。所有在BREAKPOINT模块的在SOLVEstatement之后的声明都收集起来去组成一个函数,在电荷守恒矩阵方程的构建过程访问的。这个函数访问数次为了计算电流和电导并增添到矩阵方程中。如果你没有写任何电流则函数不会访问。这个SOLVEstatement在新电压计算后执行以便进行时间步长上状态的积分。局部静态变量得到合适的离子变量的副本在机制中使用。离子变量在从这些函数退出时得到更新所以WRITE电流添加到离子电流中。PointerDESCRIPTION这些名字是指针在模型外引用到变量中。他们应该像正常单位变量一样宣布在描述体里,并像正常变量一样正确地使用。用户应该在hoc编译层里设置这些点变量到目前的变量中。目前的变量在其它机制、膜电位、任意hoc变量是正常的变量。ExternalDESCRIPTION这些名字,应该作为ASSIGNEDorPARAMETERvariables允许globalvariables在其它模型或者这个模型的NEURONc文件里使用。那就是,这个变量的定义必须出现在其它的一些文件里。注意如果这个定义出现在其它mod文件,这个名字应该明确地包含那个模型合适的后缀。你也可以从其它模型里访问函数(但不要忽视警告,确定你是将它们作为externdoublefname_othermodelsuffix()声明的。在一个VERBATIM模块里以合适的后缀名使用它们。ParameterDESCRIPTION这些是通过用户设置的变量并且不会被模型自身改变。在一个NEURON文本里这些变量的一部分需要成为范围变量,能随着位置发生改变,另一些作为全局变量会更有用。特定的变量对于NEURON如celsius,area,v,etc。如果在一个模型里使用的话应该作为parameters。(并且你不应该在模型里分配值给他们)。被使用的离子浓度,电流,电压但未在这个特定模型里设置的应该声明为参数。NMODL不能执行参数的“不变性”但在文体上它遵循一个规定由于有一个专门的域编辑窗口小部件在NEURON’sgraphicaluserinterface使得它更易去修改一个参数值。在参数中有一个遗憾的约束条件就是他们不能声明数组。即使一个数组是概念上的一个参数,它也必须作为一个ASSIGNEDvariable来声明。在NMODL里,PARAMETERSandASSIGNEDvariables几乎是同义词。他们只有在一组变量自动创建时才不一样,PARAMETERS显示在扩张域编辑器里使得更易修改值,然而ASSIGNEDvariables显示在域编辑里只有通过键盘输入来改变值。StateDESCRIPTION这些变量在微分和代数方程中是未知的。他们是正常的变量在BREAKPOINT模块中求解。例如,在HH通道里这个状态是m,h,andn。在一个NEURON文本里他们总是范围变量。离子浓度只有在特定模型机制里计算时才是一个状态。如果浓度在超过一个机制插入到相同位置的地方进行运算则仿真会出错。膜电位,v,从来就不是一个状态,因为只有NEURON本身允许去计算它的值。AssignedDESCRIPTION这些变量能够直接通过分配声明计算,并且很重要,因为你想要知道他们在仿真过程中的值。在一个NEURON文本里你想要将他们在范围变量和全局变量之前划分开。IndependentDESCRIPTION这个说明了数学独立变量。对于NMODL这个声明不是必须的因为这个独立变量总是时间t。BreakpointDESCRIPTION这个是模型的主计算模块。任何状态都通过一个SOLVE声明进行积分。电流是随着分配声明在模块的最后设置。认为这个模块是出口,所有变量都是在时间上都是一致的。这个模块名为BREAKPOINT的原因是因为在SCoP里它访问INDEPENDENTvariable的每一个变量以便用户画出什么。DerivativeDESCRIPTION如果这个状态通过微分方程控制的,这个模块被用来分配值到derivativesofthestates。这些声明是y'=expr的形式。这些公式在时间t从状态旧值到他们的新值进行正常的积分,经历一个SOLVE声明在BREAKPOINT模块。这个表达式明确涉及到时间的。对于一个DERIVATIVE模块的SOLVE声明应该被准确调用。SOLVEderivMETHODeulerorSOLVEderivMETHODrungeorSOLVEderivMETHODderivimplicit因为默认积分方法是一个不能再NEURON文本里运行的变量时间步长龙格库塔方法。这前两个方法是计算简便的但如果方程是拘谨时数值上不稳定。(在一个时间步长里状态变化很大)。HH类型机制有特别简单和有效准确状态方程,并且很容易由解析状态积分获得。ProcedureDESCRIPTIONProcedures通常不会返回一个值但是会访问他们的副作用,比如,变量的设置。Procedures是可以通过用户在NEURON偿还的。然而如果一个procedure被用户访问,并使用到任意范围变量,那么用户就对识别来自什么位置负责,应该得到它的范围变量数据。这是和hoc函数相关的:setdata_mechname(x)wheremechnameisthemechanismname.对于范围变量这里当然有一个当前访问部位。在点处理情况下,一个调用程序使用对象表示法pp_objref.procname()既然这样procname通过pp_objref使用点处理引用的例子数据。有时候,状态方程很简单,比如,HH状态,这个重要高效收益和额外准确度能够通过一个特殊的积分步骤获得。在这种情况下这个程序能够通过一个SOLVE声明访问并事实上对状态进行了积分。VERBATIMreturn...;ENDVERBATIMFunction通过增加机制的后缀名,例如alpha_kd和beta_kd().函数或程序很容易被hoc访问假如他们没有引用范围变量(引用GLOBAL变量是允许的)。假如一个函数或程序的确引用了一个范围变量,那么在hoc访问函数之前必须说明这机制详细的情况(它在细胞的位置)。这通过一个setdata_函数来完成Section_namesetdata_suffix(x)部件名是section_name,包含了上述机制,suffix是机制后缀,x是沿着