Neuron语法.docx
《Neuron语法.docx》由会员分享,可在线阅读,更多相关《Neuron语法.docx(15页珍藏版)》请在冰豆网上搜索。
Neuron语法
NMODL语法
UNITS
(mV)=(millivolt)
(mA)=(milliamp)
(S)=(siemens)
DESCRIPTION
NEURON{
SUFFIX...
RANGE...
GLOBAL...
NONSPECIFIC_CURRENT...
USEION...READ...WRITE...VALENCEreal
POINT_PROCESS...
POINTER...
EXTERNAL...
}
Suffix
DESCRIPTION
Thesuffix(后缀),"_name"能够附加在所有的变量,函数,和程序里。
如果SUFFIX声明是缺省的,则以文件名作为后缀(以一个下划线字符作为添加)。
如果有一个POINT_PROCESS声明,则这声明作为后缀。
后缀能够防止名字的重载。
在将来的某个时候我可能添加类似于访问声明的东西,对于特定机制它将允许省略后缀。
注意这个后缀本身没有在模型描述文件里使用。
如果后缀名是nothing,则对于变量函数程序没有明确的后缀声明在mod文件中。
然后,这机制的名字将会是基本文件名。
这是有用的如果你知道没有冲突的名字存在或者mod文件首先用来创建可随时偿还的函数,并且你想要准确地指定函数名。
Range
DESCRIPTION
这些名字将成为范围变量。
不要在这里加后缀。
这些名字也应该在NEURON模块外部的标准的PARAMETERorASSIGNED声明中出现。
Parameters不能出现在一个NEURONRANGE声明中将会变成全局变量。
Assigned变量不能出现在这个声明中或者是NEURONGLOBAL声明中将会隐藏起来。
当一个机制插入一个部分,这些范围变量的值在NEURON模块外部的标准PARAMETER声明中设置为指定的值。
Global
DESCRIPTION
这些名字应该在别处声明为ASSIGNEDorPARAMETERvariables,成为全局变量而不是局部变量。
注意这里默认对PARAMETERvariable变成全局变量然而默认对一个ASSIGNEDvariable隐藏在用户层里。
Nonspecific_Current
DESCRIPTION
这表示我们计算添加到总的膜电流的局部电流不会有助于任意的离子浓度。
这个电流在任意SOLVE声明后但是在BREAKPOINT模块前应该被指定一个值。
这个名字将会被隐藏在用户层除非它出现在一个里。
Useion
DESCRIPTION
这个声明一个特异性离子种类将会用在模型里。
这个内置的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电流添加到离子电流中。
Pointer
DESCRIPTION
这些名字是指针在模型外引用到变量中。
他们应该像正常单位变量一样宣布在描述体里,并像正常变量一样正确地使用。
用户应该在hoc编译层里设置这些点变量到目前的变量中。
目前的变量在其它机制、膜电位、任意hoc变量是正常的变量。
External
DESCRIPTION
这些名字,应该作为ASSIGNEDorPARAMETERvariables允许globalvariables在其它模型或者这个模型的NEURONc文件里使用。
那就是,这个变量的定义必须出现在其它的一些文件里。
注意如果这个定义出现在其它mod文件,这个名字应该明确地包含那个模型合适的后缀。
你也可以从其它模型里访问函数(但不要忽视警告,确定你是将它们作为externdoublefname_othermodelsuffix()声明的。
在一个VERBATIM模块里以合适的后缀名使用它们。
Parameter
DESCRIPTION
这些是通过用户设置的变量并且不会被模型自身改变。
在一个NEURON文本里这些变量的一部分需要成为范围变量,能随着位置发生改变,另一些作为全局变量会更有用。
特定的变量对于NEURON如celsius,area,v,etc。
如果在一个模型里使用的话应该作为parameters。
(并且你不应该在模型里分配值给他们)。
被使用的离子浓度,电流,电压但未在这个特定模型里设置的应该声明为参数。
NMODL不能执行参数的“不变性”但在文体上它遵循一个规定由于有一个专门的域编辑窗口小部件在NEURON’sgraphicaluserinterface使得它更易去修改一个参数值。
在参数中有一个遗憾的约束条件就是他们不能声明数组。
即使一个数组是概念上的一个参数,它也必须作为一个ASSIGNEDvariable来声明。
在NMODL里,PARAMETERSandASSIGNEDvariables几乎是同义词。
他们只有在一组变量自动创建时才不一样,PARAMETERS显示在扩张域编辑器里使得更易修改值,然而ASSIGNEDvariables显示在域编辑里只有通过键盘输入来改变值。
State
DESCRIPTION
这些变量在微分和代数方程中是未知的。
他们是正常的变量在BREAKPOINT模块中求解。
例如,在HH通道里这个状态是m,h,andn。
在一个NEURON文本里他们总是范围变量。
离子浓度只有在特定模型机制里计算时才是一个状态。
如果浓度在超过一个机制插入到相同位置的地方进行运算则仿真会出错。
膜电位,v,从来就不是一个状态,因为只有NEURON本身允许去计算它的值。
Assigned
DESCRIPTION
这些变量能够直接通过分配声明计算,并且很重要,因为你想要知道他们在仿真过程中的值。
在一个NEURON文本里你想要将他们在范围变量和全局变量之前划分开。
Independent
DESCRIPTION
这个说明了数学独立变量。
对于NMODL这个声明不是必须的因为这个独立变量总是时间t。
Breakpoint
DESCRIPTION
这个是模型的主计算模块。
任何状态都通过一个SOLVE声明进行积分。
电流是随着分配声明在模块的最后设置。
认为这个模块是出口,所有变量都是在时间上都是一致的。
这个模块名为BREAKPOINT的原因是因为在SCoP里它访问INDEPENDENTvariable的每一个变量以便用户画出什么。
Derivative
DESCRIPTION
如果这个状态通过微分方程控制的,这个模块被用来分配值到derivativesofthestates。
这些声明是y'=expr的形式。
这些公式在时间t从状态旧值到他们的新值进行正常的积分,经历一个SOLVE声明在BREAKPOINT模块。
这个表达式明确涉及到时间的。
对于一个DERIVATIVE模块的SOLVE声明应该被准确调用。
SOLVEderivMETHODeuler
or
SOLVEderivMETHODrunge
or
SOLVEderivMETHODderivimplicit
因为默认积分方法是一个不能再NEURON文本里运行的变量时间步长龙格库塔方法。
这前两个方法是计算简便的但如果方程是拘谨时数值上不稳定。
(在一个时间步长里状态变化很大)。
HH类型机制有特别简单和有效准确状态方程,并且很容易由解析状态积分获得。
Procedure
DESCRIPTION
Procedures通常不会返回一个值但是会访问他们的副作用,比如,变量的设置。
Procedures是可以通过用户在NEURON偿还的。
然而如果一个procedure被用户访问,并使用到任意范围变量,那么用户就对识别来自什么位置负责,应该得到它的范围变量数据。
这是和hoc函数相关的:
setdata_mechname(x)
wheremechnameisthemechanismname.对于范围变量这里当然有一个当前访问部位。
在点处理情况下,一个调用程序使用对象表示法
pp_objref.procname()
既然这样procname通过pp_objref使用点处理引用的例子数据。
有时候,状态方程很简单,比如,HH状态,这个重要高效收益和额外准确度能够通过一个特殊的积分步骤获得。
在这种情况下这个程序能够通过一个SOLVE声明访问并事实上对状态进行了积分。
VERBATIM
return...;
ENDVERBATIM
Function
通过增加机制的后缀名,例如alpha_kd和beta_kd().函数或程序很容易被hoc访问假如他们没有引用范围变量(引用GLOBAL变量是允许的)。
假如一个函数或程序的确引用了一个范围变量,那么在hoc访问函数之前必须说明这机制详细的情况(它在细胞的位置)。
这通过一个setdata_函数来完成
Section_namesetdata_suffix(x)
部件名是section_name,包含了上述机制,suffix是机制后缀,x是沿着这部件的标准距离,是机制的特定情况存在的部位。
描述n的动力学微分方程涉及了两个电压依赖比率常数是通过函数alpha()和beta()计算的。
当v=-55mV时,alpha的分母会变成0,引起数值溢出。
在alpha()里的代码通过转换避免了这个,当v非常接近-55时,变成了另一种基于ex无穷级数扩张的前三个级数。
FUNCTIONf_name(arg1(units1),arg2(units2),...)(returned_units)
这个语法表明了它们的参数值是mV单位,返回值是毫秒的倒数单位(/ms),为了函数的易读性,指令UNITSOFF……UNITSON使得单位检查只是在这些函数体里丧失功能。
否则语句将会不得不重写而为了保持单位的一致性。
例如:
x=(Vm+55(millivolt))/(10(millivolt))
某些变量的存在仅仅是为了计算方便。
这些通常作为规模因子,标识,或对于中间结果的临时存储,并不是最重要的机制。
此类变量通常在一个方程模块里称为LOCAL变量,例如,x在这个机制。
LOCAL变量在模块外是不可见的且在不同模块的调用之间不能保持自己的值。
Hoc
strdefstringname
声明一个用逗号分隔的字符串变量。
字符串变量不能是数组。
字符串可以作为函数的参数。
button-menu-panel
general
xbuttonxlabelxpvaluexstatebutton
xcheckboxxmenuxradiobuttonxvalue
xfixedvaluexpanelxsliderxvarlabel
Thefollowingareimplementedashocfunctions.Theyareusedtocreatepanelsofbuttons,menus,andfieldeditors.
xpanel
SYNTAX
xpanel("name")
xpanel("name",[0-1])
xpanel()
xpanel(x,y)
xpanel(scroll)
xpanel(scroll,x,y)
DESCRIPTION
xpanel("name")
xpanel("name",[0-1])
一个新面板的题目。
每一个按钮,菜单和在这个和一个关闭着的无参数的xpanel()命令之间的值都属于这个面板。
如果这个形式是用一个第二参数等于1,那么这个是水平地排列。
否则这个默认值是垂直的。
xpanel()
xpanel(x,y)
完成构建面板。
所以将其映射到屏幕上可选的指定位置。
xpanel(slider)
xpanel(slider,x,y)
xbutton
SYNTAX
xbutton("command")
xbutton("prompt","command")
DESCRIPTION
xbutton("command")
newbuttonwithcommandtoexecutewhenpressed.Thelabelonthebuttonis"command".
xbutton("prompt","command")
标签is"prompt",运行动作is"command".
xbutton出来的效果就是长方形方框所示。
xstatebutton
SYNTAX
xstatebutton("prompt",&var[,"action"])
DESCRIPTION
likexbutton,butwhenpressedvarissetto0or1sothatitmatchesthetelltalestateofthebutton.Ifthevarissetbyanotherwaythetelltalestateisupdatedtoreflectthecorrectvalue.
xcheckbox
SYNTAX
xcheckbox("prompt",&var[,"action"])
DESCRIPTION
likexstatebutton,butcheckboxappearance.
xradiobutton
SYNTAX
xradiobutton("name","action")
xradiobutton("name","action",0or1)
DESCRIPTION
像一个xbutton但是凸显了最近连续选择的一个组。
如果第三个参数是1,那么当面板投影在屏幕上时这个按钮将会被选择。
EXAMPLES
executefollowingexample
proca(){
print$1
}
strdeflabel,cmd
xpanel("panel")
xmenu("menu")
fori=1,10{
sprint(label,"item%d",i)
sprint(cmd,"a(%d)",i)
xradiobutton(label,cmd)
}
xmenu()
xpanel()
xmenu
button-menu-panel
SYNTAX
xmenu("title")
xmenu()
xmenu("title",1)
xmenu("title","stmt")
xmenu("title","stmt",1)
DESCRIPTION
xmenu("title")
创建一个名为title的按钮在面板上,当按下时,出现一个菜单包含按钮和其它功能。
每一个xbutton和在这个和关闭着的xmenu()之间的xmenu命令都是无参数的构成菜单。
xmenu()
定义菜单结束。
Menuscanbenestedasin
xmenu("one")
xmenu("two")
xmenu()
xmenu()
xmenu("title",1)
addsthemenutothemenubar.Notethatatoplevelmenuwithnosecondargumentstartsanewmenubar.Normallythesemenubarshaveonlyonetoplevelitem.
xpanel("menubar")
xmenu("first")
xbutton("one","print1")
xbutton("two","print2")
xmenu()
xmenu("second",1):
1表示在同一行显示
xbutton("three","print3")
xbutton("four","print4")
xmenu("submenu")
xbutton("PI","printPI")
xmenu()
xmenu()
xmenu("third",1)
xbutton("five","print5")
xbutton("six","print6")
xmenu()
xmenu("nextline"):
没有1表示跳到下一行
xbutton("seven","print7")
xbutton("eight","print8")
xmenu()
xpanel()
xmenu("title","stmt")andxmenu("title","stmt",1)
动态菜单作为项添加到面板或菜单或是一个菜单栏(当第三个参数为1)。
当菜单标题按钮选择了,这stmt就会在一个文本里执行像这样:
xmenu("title")
stmt
xmenu()
whichshouldnormallybuildamenulistandthenthislistismappedtothescreenasanormalwalkingmenu.
executefollowingexample
load_file("nrngui.hoc")
xpanel("test")
xmenu("dynamic","make()")
xpanel()
strdefs1,s2
n=0
procmake(){locali
n+=1
fori=1,n{
sprint(s1,"label%d",i)
sprint(s2,"print%d",i)
xbutton(s1,s2)
}
}
这个程序功能是当选择菜单里的第一项时,它会自动生成第二项,如此类推。
xlabel
SYNTAX
xlabel("string")
DESCRIPTION
作为一个固定的标签显示字符串。
xvarlabel
SYNTAX
xvarlabel(strdef)
DESCRIPTION
显示当前字符串的值。
xvalue
SYNTAX
xvalue("variable")
xvalue("prompt","variable"[,boolean_deflt,"action"[,boolean_canrun,boolean_usepointer]])
xvalue("prompt","variable",2)
DESCRIPTION
xvalue("variable")
为变量创建字段编辑器。
xvalue("prompt","variable"[,boolean_deflt,"action"[,boolean_canrun,boolean_usepointer]])
为带有按钮标签"prompt"的变量创建字段编辑器。
如果boolean_deflt==1那么添加一个复选框,当和作者创建的不一样时被选中。
执行"action"当用户输入一个新的值。
如果boolean_canrun==1那么使用一个default_buttonExecute小外壳取代一个push_button外壳。
如果boolean_usepointer是真的那么试着使用变量地址代替一直解释它。
如果这个按钮在一个目标里创建,这时你必须使用这个地址形式,否则当按钮按下去时,这个标记名不会在目标的文本内解释而是在一个更高层的文本。
xvalue("prompt","variable",2)
一个字段编辑器每个第十doNotify()持续更新。
定义域的值能够由用户成为一个字段编辑器的,可能会受