Last update 14-Feb-2016
04-Jan-2012
通常、NEURONはocというインープリタが使用され、ocがいろいろなライブラリを呼び出すことにより計算処理を行っています。このインタープリタの機能をPythonにさせる事ができます。Pythonもインタープリタ言語ですが、最近、科学の広い分野で使用されています。pythonの特徴としては、いろいろなライブラリを結びつける機能が優れていることがあげられます。
利点
欠点
ocとpythonのどちらを用いるかは議論のあるところですが、NEURONの領域を超えて解析やグラフ化などの拡張的な使用を考えているなら、pythonを用いる方が有利だと思われます。
詳しくは、Himes ML, Davison AP, & Muller E. NEURON and Python. Front Neuroinform 3:1, 2009.
現在のbinary distribution 7.4は、MacOS版、Windows版の両方ですでにpython機能が組み込まれています。MacOSの場合、ターミナル(コマンドプロンプト)からnrnivを立ち上げるときに、nrniv -pythonとすればpython modeとなっています。またWindowsの場合は、nrnivもしくはneuronを使用します。プロンプトがoc modeの時はoc>であるのに対して、python modeの場合は、>>>となり、pythonモードであることがわかります。
この場合にどのpythonが使用されているかは、
>>> import sys
>>> sys.version
で知る事ができます。binary distributionの場合は、python2.7が使用されています。python2.7は、MacOSのEl Capitanで使用されているバージョンです。
Neuronのダウンロードサイトより64bit.dmg (nrn-7.4.x86_64-apple-OSX10.7.dmg)をダウンロードして、インストールすれば事足ります。プログラムは/Applicationsにインストールされます。
コマンドで使用するのは、nrnivとnrnivmodlなので、これらにPATHを通しておくと便利です。
MacOSでは、下記の方法でPATHの設定を行う事ができます。
このようにインストールしたバージョンで普通問題はありませんが、他のpythonライブラリをうまく使えないなどの場合に、コンパイルし直すと動くことがあります。私の場合、matplotlibがうまく使えずコンパイルをしました。多分、他の解決方法もあったのだろうと思います。
以下、MacOSでのコンパイルの方法です。
NEURONをソースコードからコンパイルする場合、ivについては通常と同じです。nrnについては、
./configureの時に--with-nrnpython を加えます。複数のpythonがある場合に、どのpythonが使用されるかは、コマンドでpythonとした時に起動するものが使用されていると思われます。
$ cd (source code directory)
$ cd iv
$ ./configure --prefix=/Applications/NEUORN-7.4/iv
$ make
# make install
$ cd ../nrn
$./configure --prefix=/Applications/NEUORN-7.4/nrn --with-iv=/Applications/NEUORN-7.4/iv --with-nrnpython
$ make
# make install
余談ですが、MacOSではいろいろなユティリティプログラムにpythonが用いられています。OSに付属のpython (python2.7)を動かなくすると、これらのユティリティプログラムの動作に支障を来します(例えばAutomator)。Linuxでも同様の事が起きます。
問題なくMacOSの場合と同じようにPythonを使用することが可能です。
もしpythonのpathが/usr/local/binにあり、neuronを$HOME/neuronにインストールするとすれば、nrnをconfigureする時に、
$./configure --prefix=$HOME/neuron/nrn --with-iv=$HOME/neuron/iv --with-nrnpython=/usr/local/bin/python
とすればOKです。
WindowsでNEURONをまともに動かすのは、容易ではありませんでした。それはNEURONが、もともとUNIX/Linuxの環境で開発され、開発に使用されたツール類が通常のWindowsの開発ツールと互換性を持たないためでした。実際Windowsで走るNEURONは、一般的に用いられるMicrosoft visual studio C++コンパイラではなく、Windows上でUNIX/Linuxに似た環境をつくるcygwinのgccでbuildされていました。
しかしWindows上にLinux/MacOSに似た環境を提供するシステム(Cygwin、Msysなど)とそれらに適合したコンパイラ(GCC C/C++コンパイラなど)が安定して使えるようになったことから、WindowsでもNEURONをPythonモードで不自由なく使えるようになりました。
何が必要か?
どのようにNEURONを利用するかによって、準備の程度は違ってきます。それぞれの場合、上から順番にインストールしていきます。各項目の詳細は下に説明してあります。
Mingw-64のインストール
Mingw-w64は、Windowsの環境で使えるGNUコンパイラ(C/C++、Fortranなど)とその周辺のソフトです。
Msys2のインストール
Msys2により、いわゆるシステムコマンド(bash, awk, sed, find, grepなど)が使えるようになります。パッケージマネジャーpacmanにより、不足しているプログラムをインストールすることができます。
Anaconda Pythonのインストール
Anaconda版のPythonには、使用頻度の高いnumpy、scipy、matplotlibが含まれている。
注意事項
NEURONのインストール
import pylab
import numpy
from neuron import h
class Cell():
def __init__(self):
self.soma = h.Section ()
self.apical = h.Section ()
self.basilar = h.Section()
self.axon = h.Section ()
self.dendrites = []
self.dendrites.append(self.apical)
self.dendrites.append(self.basilar)
def topology(self):
self.apical.connect(self.soma, 1, 0)
self.basilar.connect(self.soma, 0, 0)
self.axon.connect(self.soma, 0, 0)
def geometory(self):
self.soma.L = 30
self.soma.nseg = 1
self.soma.diam = 30
self.apical.L = 600
self.apical.nseg = 23
self.apical.diam = 1
self.basilar.nseg = 5
self.basilar.diam = 2
self.basilar.L = 200
self.axon.L = 1000
self.axon.nseg = 37
self.axon.diam = 1
def biophysics(self):
for sec in h.allsec():
sec.Ra = 100
sec.cm = 1
self.soma.insert('hh')
self.apical.insert('pas')
self.basilar.insert('pas')
for sec in self.dendrites:
for seg in sec:
seg.pas.g = 0.0002
seg.pas.e = -65
self.axon.insert('hh')
self.syn = h.AlphaSynapse(0.5, sec=self.soma)
self.syn.onset = 0.5
self.syn.gmax = 0.05
self.syn.e = 0
def main():
cell = Cell()
cell.topology()
cell.geometory()
cell.biophysics()
dt = 0.025
tstop = 5.0
v_init = -65.0
t = numpy.arange(0.0, tstop, dt)
npts = t.size
v = numpy.zeros(npts)
v[0] = v_init
cvode = h.CVode()
cvode.active(1)
cvode.atol(1.0e-5)
h.finitialize(v_init)
for i in range(1,npts):
cvode.solve(h.t + dt)
v[i] = cell.soma(0.5).v
pylab.plot(t,v)
pylab.draw()
pylab.show()
if __name__ == '__main__':
main()