プログラム

発火率計算機を作成しました。

こんにちは、Rafkaです。

ちょっと研究周りで忙しかったので間が空いてしまいましたが、その一環で発火率計算機を作成したので、今回はその紹介と使い方の解説を行います。

 

何をするプログラムか


ラスタープロットと呼ばれるグラフを作成できるファイルフォーマット(一列目に時間、二列目に発火したニューロンの番号)から、発火率を計算しファイルに出力するプログラムです。

ラスタープロットに使うファイルが複数であっても、zipファイルで指定できるのでコマンドが複雑化せず、また、発火率の計算に必要なシミュレーションの時間や時間窓の幅などの情報を対話的に入力できるようにすることで、シミュレーションの内容毎にプログラムを変更する必要がありません。更に、対話的に入力することが面倒な場合に、予め入力内容を指定できるスクリプトにも対応しました。

 

ラスタープロット?発火率?


ニューロンとも呼ばれる神経細胞は、スパイクと呼ばれる短い電気パルス互いに送受して情報を伝達するので、シミュレーションの結果も神経細胞の電位の変化として得られます。この時、どのニューロンがいつスパイクを発射したかどうかだけに注目し、スパイクが発生した事をニューロンの種類ごとに点で表現する方法があり、ラスタープロットと言い、見た目は以下のようなグラフになります。

複数のニューロンについての活動パターンを一度に見ることができるので、入力に対する集団としての活動の傾向などを見出す上で有用です。このグラフを得るためのデータファイルも、一列目にスパイクが発生した時間、二列目にスパイクを発火したニューロンの番号を書くだけで良く、シミュレーションを回しながらファイルに出力する際に余計な計算を行う必要がないので、作成したシミュレーションがとりあえずうまく動いているかどうかの確認にも有用です。

しかし、ニューロンの活動を正しく観察するには、ラスタープロットだけでは不可能です。シミュレーションにおけるニューロンの電位の変化を観察したり、発火率と呼ばれる値を計算してその傾向を見たりする必要があるでしょう。発火率とは、単位時間あたりにそのニューロンが何回スパイクを発火するかという値で、単位は基本的に Hz です。計算方法の違いからいくつか種類があるのですが、今回の話では重要ではないので割愛します。

発火率は何回スパイクを発火するかという値ですので、スパイクの情報そのものを表すラスタープロット用のデータファイルから計算することができます。しかしその為には、シミュレーションによって異なる、シミュレーションの時間の長さや発火率計算の際の時間窓の幅、ニューロン番号とニューロンの種類の対応付などのいくつかの情報を与えねばならず、私は今まで、シミュレーションの内容が変わる度に、スパイクデータから発火率を計算するプログラムを作成してきました。

今回作成したプログラムでは、それらの情報を対話的に入力して処理できるようにしたので、シミュレーションの題材毎に作り直す必要がなくなりました。ざっとググった感じも見当たらなかったので、記事をつけて公開しました。似たような研究分野の方に良かったら使用していただいて、GitHubでPRやフィードバックをいただけたらと思います。

 

使用準備


●ソースコードからビルドする

GitHubのリポジトリgit cloneしてビルドしてください。C#で作成したので、ビルドに必要な環境は以下の通りです。

  • .NET Core 2.1 以降

.NET Coreのインストールはこちらから。

リポジトリをクローンして、.NET Coreのセットアップが完了したら、dotnetコマンドやIDEのビルド機能を使ってプログラムをビルドしてください。

ビルドが面倒という方のために、ビルド済みのバイナリも用意しました

 

●ファイルの用意

本ソフトウェアを使用する際に、データファイルはzipファイルとして指定します。これはデータファイルが複数存在する際に、ファイルを指定する手間を和らげるための仕様なので、データファイルが1つでもそれをzipにしてください。

 

使い方


本ソフトウェアはCUIベースのプログラムです。以下の文において$はプロンプトを表すこととします。

 

●ヘルプの表示

とりあえずヘルプを表示してみましょう。オプションとして、--helpまたは-hを指定することで表示することができます。

Usageにもある通り、コマンドの直後にデータファイルのzipを指定することでこのソフトウェアは動作します。その他のオプションとして表示されている、設定ファイルの指定やokの自動入力については後ほど説明します。

 

●ファイル指定

このプログラムは大きく分けて以下の4ステップで実行されます。

  1. zipファイルから実際に計算の対象とするファイルを選択する。 - ファイル指定 -
  2. 計算に必要な情報を入力する。 - 発火率計算用の情報入力 -
  3. ファイルの読み込みと発火率の計算を行う。 - 発火率計算 -
  4. ニューロンの種類ごとにファイルに書き出し。 - ファイル出力 -

手元にgrspk.zipがあったので、これを用いた動作例を示していきます。ファイル指定のステップに該当するのは以下の部分です。

このフェーズでは、いくつかのコマンドを使って計算対象とするファイルをzipに含まれるファイルから選択します。helpまたはhを入力することで使用できるコマンドを表示できます。

基本的には、addでファイルを選択し、removeまたはrmで選択したファイルを除外することができます。選択したファイルの一覧はchlistまたはclsで表示することができます。ファイルの選択が完了したら、okを入力することで次のステップに移れます。

 

●発火率計算用の情報入力

ファイルの選択が完了したら、次に発火率計算用の情報を入力していきます。入力する情報は、

  • シミュレーションの最終時刻
  • 時間窓の幅
  • サンプリングレート
  • ニューロンの総数

です。時間に関係する、シミュレーションの最終時刻・時間窓の幅・サンプリングレートは、データファイルの値と単位を揃えた状態での値を入力してください。

入力されたサンプリングレートの値に応じて、発火率を計算する時刻の列が生成され、ここで生成された時刻のそれぞれにおいて、時間窓の幅の値に応じて発火率が計算されます。例えば、時刻 \(t\) における発火率 \(f(t)\) は、時間窓の幅が \(T\) である時、\(\text{spk}(s, e)\) が時刻 \(s\) から時刻 \(e\) の間のスパイクの数を表すとすると、以下の式で計算されます。

$$f(t) = \frac{\text{spk}(t - \frac{T}{2}, t + \frac{T}{2})}{T}$$

今回使用したgrspk.zipに含まれるデータファイルには、時間はmsで記録されていたので、シミュレーションの最終時刻が6s、時間窓の幅を1s、サンプリングレートを30Hzとしたい場合には、以下のような値で入力する必要があります。

  • シミュレーションの最終時刻:6s → 6000 ms
  • 時間窓の幅:1s → 1000 ms
  • サンプリングレート:30 Hz = 30 /s → 0.03 /ms

また、データファイルに記録されているニューロンの総数は2114個ですので、従ってこのステップでの入力は以下のようになります。

全ての情報の入力が完了すると、自動的に次のステップに移ります。

 

●発火率計算

計算に必要な情報が全て入力されると、自動的にこのステップに移ります。指定されたファイルを読み込んだあと、発火率の計算が行われます。

全て完了した後に、自動的に次のステップに移ります。

 

●ファイル出力

計算した発火率をファイルに出力するステップになります。ファイルに出力するニューロン番号をレンジで指定して出力するのですが、大抵のシミュレーションでは、ニューロン番号とニューロンの種類が対応していると思うので、番号のレンジの指定と同時に名前を指定できるようにしてみました。

以下の例では、0番から1023番をGrという名前で、1024番から2047番までをGoという名前でファイルに出力しています。

ファイル名は"{名前}.frate.{計算元となったデータファイルの名前}"となり、実行ファイル直下にoutputディレクトリが生成されてそこに格納されます。

発火率のファイルの書式は、1列目が時刻、2列目以降がニューロン番号ごとの発火率になり、各列間は空白で区切られています。

 

●設定ファイルと自動実行

今までのやり方で対話的にデータを入力して発火率を計算させることもできるのですが、予め入力する内容をファイルに分けておいて、実行時にそのファイルを指定することで自動的に入力を行う方法もあります。

例として、以下のような設定ファイルをfrc.settingという名前で作成しました。

使える命令は以下の通りです。パスカルケースで書いてありますが、全部小文字とか部分的に適当に大文字にされていても大丈夫です。

  • FileLoad:zipから読み込むファイルを指定します。
  • EndTime:シミュレーションの終了時刻を設定します。
  • TimeBin:時間窓の幅を設定します。
  • SamplingRate:サンプリングレートを設定します。
  • NumberOfNeuron:ニューロンの総数を設定します。
  • Output:出力の設定をします。

この設定ファイルを使用してgrspk.zipの計算を実行するには、$ ./FiringRateCalculator grspk.zip -s frc.setting と入力すればできます。-s はsettingのsです。ただし、このままでは ok の入力が求められる場面でプログラムが待機するので、-y オプションを追加することで、okを自動で入力してくれるようになります。

つまり、設定ファイルを用いて完全に自動で実行してもらうには、$ ./FiringRateCalculator grspk.zip -s frc.setting -y と入力すればできます。

 

最後に


このプログラムはもっと別の本命のプログラムの補助ツールとして作成したので、クオリティ面に不安を抱えております。

本ソフトウェアを使用したことによる損害等についての責任は一切負いかねますが、機能の追加の要望やバグ修正などは、ここのコメント欄やGitHubのPR等でいつでも歓迎しておりますので、よろしくお願い致します。