[Prev] [Up] [Next]

Last update 14-Feb-2016
04-Jan-2012

3. NEURONをPythonで動かす

なぜPython?

通常、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のインストール(MacOS)

Neuronのダウンロードサイトより64bit.dmg (nrn-7.4.x86_64-apple-OSX10.7.dmg)をダウンロードして、インストールすれば事足ります。プログラムは/Applicationsにインストールされます。

コマンドで使用するのは、nrnivとnrnivmodlなので、これらにPATHを通しておくと便利です。

MacOSでは、下記の方法でPATHの設定を行う事ができます。

  1. ~/.bash_profileを使用。最も古典的な方法。コマンドラインからプログラムを起動する時は問題ありませんが、アイコンをクリックして起動する場合にPATHを読み込まない、という問題が生じます。
  2. /etc/paths
    管理者権限が必要です。先に現れる方が優先度が高くなります。/etc/paths.dを使う事も可能。
  3. すでにPATHが通っているところに、symbolic linkを作るという方法もあります。これは手軽です。例えば、すでに~/$HOME/binPATHが通っている場合、
    $ cd ~/$HOME/bin
    $ ln -s /Applications/NEURON-7.4/nrn/x86_64/bin/nrniv nrniv

    でsymbolic linkを張ることができます。

このようにインストールしたバージョンで普通問題はありませんが、他の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でも同様の事が起きます。

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の場合

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を利用するかによって、準備の程度は違ってきます。それぞれの場合、上から順番にインストールしていきます。各項目の詳細は下に説明してあります。

  1. NEURONをocで利用する場合
  2. NEURONをpythonモードで利用する場合
  3. より一般的なプログラム開発環境を整備する場合

Mingw-64のインストール

Mingw-w64は、Windowsの環境で使えるGNUコンパイラ(C/C++、Fortranなど)とその周辺のソフトです。

  1. mingw-w64のインストールファイルのダウンロード
    http://sourceforge.net/projects/mingw-w64/files/から、 Toolchains targetting Win64 → Personal Builds → mingw-builds → 5.3.0 → threads-posix → seh とたどっていき、 x86_64-5.3.0-release-posix-seh-rt_v4-rev0.7z をダウンロード
  2. C:\に解凍します
    全部で500 MB程度
  3. 環境変数PATHC:\mingw64\binを加えます
  4. 正しくインストールと設定できていれば、たとえば、コマンドプロンプトから
    > gfortran --version
    と入力すると、gfortranのバージョンが示されるはずです

Msys2のインストール

Msys2により、いわゆるシステムコマンド(bash, awk, sed, find, grepなど)が使えるようになります。パッケージマネジャーpacmanにより、不足しているプログラムをインストールすることができます。

  1. https://msys2.github.io/より、msys2-x86\_64-20150916.exeをダウンロード
  2. ダウンロードしたファイルを走らせると、C:\msys64が作られて、その下にインストールされます
  3. 環境変数PATHに、C:\msys64\usr\binを加えます
  4. デフォールトではmakeがインストールされていないので、コマンドから、
    > pacman -S make
    として、makeをインストールします

Anaconda Pythonのインストール

Anaconda版のPythonには、使用頻度の高いnumpyscipymatplotlibが含まれている。

  1. https://www.continuum.io/downloadsから、python 2.7のインストールファイルAnaconda2-2.4.1-Windows-x86_64.exe をダウンロード
  2. 管理者権限で走らせてインストール
    PythonはC:\Anacondaにインストールされる
    PATHは自動的に設定される
  3. コマンドプロンプトから
    $ python
    でpythonが動く

注意事項

NEURONのインストール

  1. NEURONサイトからnrn-7.4-x86_64-w64-ming32-setup.exeダウンロード
  2. 普通にインストール
  3. 環境変数PATHC:\nrn\binを追加する
  4. コマンドプロンプトから
    $ nrniv
    で、NEURONが起動する
  5. Pythonがインストールされていれば、 $ nrniv -python
    でneuronがpythonモードで起動し
    >>> import sys
    >>> sys.version
    でAnaconda版のpythonが示される。

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()

[Prev] [Up] [Next]